【问题标题】:How do I get text orientation of a text string in a PDF page using CAM::PDF?如何使用 CAM::PDF 在 PDF 页面中获取文本字符串的文本方向?
【发布时间】:2009-04-13 19:50:07
【问题描述】:

我正在使用 CAM::PDF,我想了解如何获取文本字符串的方向。

谢谢

【问题讨论】:

  • 方向是什么意思?
  • 方向 = 垂直或水平(或任何其他角度,如 180 或 270)
  • 水平应为 0 度,垂直应为 90。
  • 这个字符串,这是您从任意 PDF 输入文件中读出的内容吗?也许您可以更详细地描述您的用例。

标签: perl pdf


【解决方案1】:

一些相关的问题:How can I get the page orientation of a PDF page?How do I get character offset information from a pdf document?

从后一个问题的解决方案开始,我想出了这个秘诀:

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;
}

在 PDFReference15_v5.pdf 的第 565 页产生了这个结果:

text 'ab' at (371.324,583.7249), angle -1.5707963267949
text 'c' at (371.324,576.63365), angle -1.5707963267949

请注意,角度以弧度为单位。除以 Pi 并乘以 180 以将其转换为度数。所以,-1.5707963267949 是 270 度,与第 565 页一致。

请注意,打印的角度是相对于页面内容的角度。如果页面本身被进一步旋转(根据上面的页面方向问题),那么您可能需要复合旋转计算。

【讨论】:

  • 该 PDF 第 565 页的屏幕截图,显示旋转后的文本:chrisdolan.net/misc/page-orientation-example.png
  • 谢谢克里斯!像魅力一样工作。实际上,我发布了您提到的相关问题之一。我希望你也能回答这个问题。再次感谢。
  • 哦,原来如此!有趣,我以为你的名字看起来很熟悉,但我没有放它。 :-)
猜你喜欢
  • 1970-01-01
  • 2016-12-28
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
相关资源
最近更新 更多