-je utiliser ce qui suit pour lire un fichier PDF et d'obtenir des chaînes de texte d'une page:Comment puis-je obtenir la largeur et la hauteur d'une chaîne de texte avec CAM :: PDF?
my $pdf = CAM::PDF->new($pdf_file);
my $pagetree = $pdf->getPageContentTree($page_no);
# Get all text strings of the page
# MyRenderer is a separate package which implements getTextBlocks and
# renderText methods
my @text = $pagetree->traverse('MyRenderer')->getTextBlocks;
Maintenant, @text
a toutes les chaînes de texte et commencer x, y de chaque chaîne de texte.
Comment puis-je obtenir la largeur (et éventuellement la hauteur) de chaque chaîne?
package MyRenderer est la suivante:
package MyRenderer;
use base 'CAM::PDF::GS';
sub new {
my ($pkg, @args) = @_;
my $self = $pkg->SUPER::new(@args);
$self->{refs}->{text} = [];
return $self;
}
sub getTextBlocks {
my ($self) = @_;
return @{$self->{refs}->{text}};
}
sub renderText {
my ($self, $string, $width) = @_;
my ($x, $y) = $self->textToDevice(0,0);
push @{$self->{refs}->{text}}, {
str => $string,
left => $x,
bottom => $y,
right =>$x + $width,
};
return;
}
Mise à jour 1: Il y a une fonction GetStringWidth ($ FontMetrics, $ string) en CAM :: PDF. Bien qu'il y ait un paramètre $ fontmetrics dans cette fonction, indépendamment de ce que je passe à ce paramètre, la fonction renvoie la même valeur pour une chaîne donnée.
En outre, je ne suis pas sûr de l'unité de mesure utilisée par la valeur retournée.
Mise à jour 2: j'ai changé la fonction renderText à suivre:
sub renderText {
my ($self, $string, $width) = @_;
my ($x, $y) = $self->textToDevice(0,0);
push @{$self->{refs}->{text}}, {
str => $string,
left => $x,
bottom => $y,
right =>$x + ($width * $self->{Tfs}),
font => $self->{Tf},
font_size => $self->{Tfs},
};
return;
}
Notez que, en plus d'obtenir la police et taille_police, je multipliai $ width avec la taille de la police pour obtenir la largeur réelle de la chaîne .
Maintenant, seule la hauteur est manquante. GetStringWidth() dépend fortement des métriques de police que vous fournissez.
Merci pour les commentaires Chris. Vérifier ma mise à jour 2 dans OP. J'espère que ce que j'ai fait était juste pour obtenir la largeur. – Thushan