2009-04-13 6 views
4

私はCAM :: PDFを使用しており、テキスト文字列の向きを取得する方法を知りたいと思います。CAM :: PDFを使用してPDFページのテキスト文字列のテキストの向きを取得するにはどうすればよいですか?

おかげ

+0

オリエンテーションの意味は? –

+0

方向=縦または横(または180または270のような他の角度でもよい) – Thushan

+0

水平は0度、垂直は90でなければなりません。 – Thushan

答えて

2

やや関連質問:How can I get the page orientation of a PDF page?How do I get character offset information from a pdf document?

は、後者の質問に対する解決策を皮切りに、私はこのレシピを思い付いた:ページ565のためにこのような結果をもたらした

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の:

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ページに一致します。

印刷された角度は、ページの内容を基準にした角度で​​す。ページ自体がさらに回転している場合(上記のページの向きの質問に従って)、回転計算を複合することができます。

+0

そのPDFのページ565のスクリーンショット、回転したテキストを表示:http://chrisdolan.net/misc/page-orientation-example.png –

+0

おかげさまでクリス! チャームのように働いた。 実際、私があなたが言及した関連する質問の1つを投稿しました。 そして私はあなたもこれに答えることを望んでいました。 もう一度ありがとうございます。 – Thushan

+0

ああ、そうでした!面白い、私はあなたの名前はよく知られていると思ったが、私はそれを配置していない。 :-) –

関連する問題