Я использую следующее для чтения 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;
Теперь @text
содержит все текстовые строки и начинается с x, y каждой текстовой строки.
Как я могу получить ширину (и, возможно, высоту) каждой строки?
Пакет MyRenderer выглядит следующим образом:
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;
}
Обновление 1:
Есть функция getStringWidth ($ fontmetrics, $ string)
в CAM :: PDF. Хотя в этой функции есть параметр $ fontmetrics, независимо от того, что я передаю этому параметру, функция возвращает то же значение для данной строки.
Кроме того, я не уверен в единицах измерения, которые использует возвращаемое значение.
Обновление 2:
Я изменил функцию renderText следующим образом:
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;
}
Обратите внимание, что помимо получения font и font_size я умножил $ width на размер шрифта, чтобы получить реальную ширину строки.
Теперь не хватает только высоты.