2

Web アプリで PDF の検索結果の強調表示を実装しようとしています。元の pdf と、検索結果で使用される小さな png バージョンがあります。基本的に、次のような API を探しています。

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

Apple の Preview.app がこれを実装しているため、この情報を pdf から取得できることはわかっています。

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

PdfLibTEThttp://www.pdflib.com/products/tet/を見てみて ください

(無料ではありません)

ファブリツィオ

于 2008-10-15T10:39:46.537 に答える
1

Adobeから無料でダウンロードできる Linux バージョンの Adob​​e Acrobat SDK を使用してこれを行うことができると思います。これを使用してPDF からテキストを抽出し、オフセットを計算できます。PDF は、Acrobat XML 強調表示ファイルを使用して強調表示できます。これは、強調表示する位置の単語を指定するために使用され、次のように acrobat に供給されます。

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

于 2008-10-14T11:20:29.763 に答える