Как я могу получить ширину и высоту текстовой строки с помощью CAM :: PDF? - PullRequest
1 голос
/ 07 марта 2009

Я использую следующее для чтения 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 ($ fontmetrics, $ string) в CAM :: PDF. Хотя в этой функции есть параметр $ fontmetrics, независимо от того, что я передаю этому параметру, функция возвращает то же значение для данной строки.

Кроме того, я не уверен в единицах измерения, которые использует возвращаемое значение.

Обновление 2: Я изменил функцию renderText следующим образом:

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

Обратите внимание, что помимо получения font и font_size я умножил $ width на размер шрифта, чтобы получить реальную ширину строки.

Теперь не хватает только высоты.

1 Ответ

1 голос
/ 13 марта 2009

getStringWidth () сильно зависит от предоставленных вами метрик шрифта. Если он не может найти ширину символов в этой структуре данных, он возвращается к следующему коду:

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

что может быть тем, что вы видите. Когда я писал это, я думал, что это лучше, чем возвращать 0. Если ваши метрики шрифта кажутся хорошими, и вы думаете, что есть ошибка в CAM :: PDF, не стесняйтесь опубликовать более подробную информацию , и я возьму смотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...