2

我正在尝试在网络应用程序中实现 pdf 的搜索结果突出显示。我有原始 pdf 文件和搜索结果中使用的小 png 版本。本质上我正在寻找一个像这样的api:

pdf_document.find_offsets('somestring')
# => { top: 501, left: 100, bottom: 520, right: 150 }, { ... another box ... }, ...

我知道可以从 pdf 中获取这些信息,因为 Apple 的 Preview.app 实现了这一点。

需要在 Linux 上运行的东西,理想情况下是开源的。我知道您可以在 Windows 上使用 acrobat 执行此操作。

4

3 回答 3

4

CAM::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 die;
   my @text = $pagetree->traverse('MyRenderer')->getTextBlocks;
   for my $textblock (@text) {
      print "text '$textblock->{str}' at ",
            "($textblock->{left},$textblock->{bottom})\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);
   push @{$self->{refs}->{text}}, {
      str => $string,
      left => $x,
      bottom => $y,
      right => $x + $width,
      #top => $y + ???,                                                                                 
   };
   return;
}

输出看起来像这样:

text 'E' at (52.08,704.16)
text 'm' at (73.62096,704.16)
text 'p' at (113.58936,704.16)
text 'lo' at (140.49648,704.16)
text 'y' at (181.19904,704.16)
text 'e' at (204.43584,704.16)
text 'e' at (230.93808,704.16)
text ' N' at (257.44032,704.16)
text 'a' at (294.6504,704.16)
text 'm' at (320.772,704.16)
text 'e' at (360.7416,704.16)
text 'Employee Name' at (56.4,124.56)
text 'Employee Title' at (56.4,114.24)
text 'Company Name' at (56.4,103.92)

正如您从该输出中看到的那样,字符串匹配会有点乏味,但几何图形很简单(可能除了字体高度)。

于 2008-10-15T02:39:35.460 回答
1

我认为您可以使用 Adob​​e Acrobat SDK 来做到这一点,它的 Linux 版本可以从 Adob​​e 免费下载。您可以使用它从 PDF 中提取文本,然后计算出偏移量。然后可以使用Acrobat XML 突出显示文件突出显示 PDF 。这用于指定要突出显示哪些位置的单词,并按如下方式提供给 acrobat:

http://example.com/a.pdf#xml=http://example.com/highlightfile.xml

于 2008-10-14T11:20:29.763 回答
1

尝试查看 PdfLib TET http://www.pdflib.com/products/tet/

(它不是免费的)

法布里齐奥

于 2008-10-15T10:39:46.537 回答