Как получить текстовую ориентацию текстовой строки на странице PDF с помощью CAM :: PDF? - PullRequest
4 голосов
/ 13 апреля 2009

Я использую CAM :: PDF и хочу узнать, как получить ориентацию текстовой строки.

Спасибо

1 Ответ

2 голосов
/ 14 апреля 2009

Несколько связанных вопросов: Как узнать ориентацию страницы 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.

Обратите внимание, что напечатанный угол - это угол относительно содержимого страницы. Если сама страница поворачивается дальше (согласно приведенному выше вопросу об ориентации страницы), вы можете захотеть объединить вычисления поворота.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...