2009-03-06 7 views
1

私はPDFファイルを読み込み、ページのテキスト文字列を取得するには、次の使用:CAM :: PDFでテキスト文字列の幅と高さを取得するにはどうすればよいですか?

my $pdf = CAM::PDF->new($pdf_file); 
my $pagetree = $pdf->getPageContentTree($page_no); 

# Get all text strings of the page 
# MyRenderer is a separate package which implements getTextBlocks and 
# renderText methods 

my @text = $pagetree->traverse('MyRenderer')->getTextBlocks; 

を、@textは、すべてのテキスト文字列を持っており、Xを起動し、各テキスト文字列のY。

各文字列の幅(場合によっては高さ)を取得するにはどうすればよいですか?次のように

MyRendererパッケージは次のとおりです。

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

アップデート1:機能getStringWidth($フォントメトリックス、$文字列)CAMで :: PDFにあります 。その関数にパラメータ$ fontmetricsがありますが、そのパラメータに渡すものとは関係なく、関数は与えられた文字列に対して同じ値を返します。

また、返される値が使用する測定単位がわかりません。アップデート2

:文字列の実際の幅を取得するには、フォントサイズとフォントとFONT_SIZEを得ることに加えて、私は$幅を掛けたことを

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 * $self->{Tfs}), 
           font => $self->{Tf}, 
           font_size => $self->{Tfs}, 
           }; 
    return; 
} 

注: は、私は次のようにrenderText機能を変更しました。

今、高さが欠落しているだけです。

答えて

1

getStringWidth()は、ユーザーが指定するフォントメトリックに大きく依存します。そのデータ構造内に文字幅が見つからない場合は、次のコードに戻ります。

if ($width == 0) 
    { 
     # HACK!!!                 
     #warn "Using klugy width!\n";            
     $width = 0.2 * length $string; 
    } 

これはあなたが見ているものかもしれません。私がそれを書いたとき、0を返すよりも良いと思った。あなたのフォントメトリクスが良いように見えて、CAM :: PDFにバグがあると思ったら、post more detailsを気軽に見てみよう。

+0

フィードバックChrisさんありがとうございます。 OPの更新2を確認してください。 私がしたことが幅を得るのが正しかったと願っています。 – Thushan

関連する問題