私は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機能を変更しました。
今、高さが欠落しているだけです。
フィードバックChrisさんありがとうございます。 OPの更新2を確認してください。 私がしたことが幅を得るのが正しかったと願っています。 – Thushan