Несколько связанных вопросов: Как узнать ориентацию страницы PDF-страницы? и Как получить информацию о смещении символов из документа PDF?
Начиная с решения последнего вопроса, я придумал такой рецепт:
use CAM::PDF;
my $pdf = CAM::PDF->new('my.pdf') or die $CAM::PDF::errstr;
for my $pagenum (1 .. $pdf->numPages) {
my $pagetree = $pdf->getPageContentTree($pagenum) or next;
my @text = $pagetree->traverse('MyRenderer')->getTextBlocks;
for my $textblock (@text) {
print "text '$textblock->{str}' at ",
"($textblock->{left},$textblock->{bottom}), angle $textblock->{angle}\n";
}
}
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);
my ($x1, $y1) = $self->textToDevice(1,0);
push @{$self->{refs}->{text}}, {
str => $string,
left => $x,
bottom => $y,
angle => atan2($y1-$y, $x1-$x),
};
return;
}
, который дал этот результат для страницы 565 PDFReference15_v5.pdf:
text 'ab' at (371.324,583.7249), angle -1.5707963267949
text 'c' at (371.324,576.63365), angle -1.5707963267949
Обратите внимание, что угол в радианах. Разделите на Пи и умножьте на 180, чтобы преобразовать это в градусы. Так, -1.5707963267949 составляет 270 градусов, что соответствует странице 565.
Обратите внимание, что напечатанный угол - это угол относительно содержимого страницы. Если сама страница поворачивается дальше (согласно приведенному выше вопросу об ориентации страницы), вы можете захотеть объединить вычисления поворота.