Ich verwende die folgende PDF-Datei zu lesen und Textzeichenfolgen einer Seite zu bekommen:Wie kann ich die Breite und Höhe einer Textzeichenfolge mit CAM :: PDF erhalten?
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;
Nun @text
hat alle Textstrings und starten x, y jede Textzeichenfolge.
Wie kann ich die Breite (und möglicherweise die Höhe) jeder Zeichenfolge erhalten?
MyRenderer Paket ist wie folgt:
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;
}
Update 1: Es gibt eine Funktion getStringWidth ($ Fontmetrics, $ string) in CAM :: PDF. Obwohl es in dieser Funktion einen Parameter $ fontmetrics gibt, gibt die Funktion unabhängig davon, was ich an diesen Parameter übergebe, den gleichen Wert für eine gegebene Zeichenkette zurück.
Auch bin ich mir nicht sicher von der Maßeinheit der zurückgegebene Wert verwendet.
Update 2: änderte ich die render Funktion folgenden:
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;
}
Beachten Sie, dass zusätzlich zu der Schrift und font_size bekommen, ich $ Breite mit Schriftgröße multipliziert, um die wirkliche Breite des Zeichenfolge zu erhalten .
Jetzt fehlt nur noch die Höhe.
Danke für das Feedback Chris. Überprüfen Sie mein Update 2 in OP. Hoffe, was ich getan habe, war richtig, um die Breite zu bekommen. – Thushan