2009-03-06 4 views
1

Ich verwende die folgende PDF-Datei zu lesen und Textzeichenfolgen einer Seite zu bekommen:Wie kann ich die Breite und Höhe einer Textzeichenfolge mit CAM :: PDF erhalten?

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; 

Nun @text hat alle Textstrings und starten x, y jede Textzeichenfolge.

Wie kann ich die Breite (und möglicherweise die Höhe) jeder Zeichenfolge erhalten?

MyRenderer Paket ist wie folgt:

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

Update 1: Es gibt eine Funktion getStringWidth ($ Fontmetrics, $ string) in CAM :: PDF. Obwohl es in dieser Funktion einen Parameter $ fontmetrics gibt, gibt die Funktion unabhängig davon, was ich an diesen Parameter übergebe, den gleichen Wert für eine gegebene Zeichenkette zurück.

Auch bin ich mir nicht sicher von der Maßeinheit der zurückgegebene Wert verwendet.

Update 2: änderte ich die render Funktion folgenden:

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

Beachten Sie, dass zusätzlich zu der Schrift und font_size bekommen, ich $ Breite mit Schriftgröße multipliziert, um die wirkliche Breite des Zeichenfolge zu erhalten .

Jetzt fehlt nur noch die Höhe.

Antwort

1

getStringWidth() hängt stark von den von Ihnen bereitgestellten Schriftmetriken ab. Wenn es nicht die Zeichenbreiten in dieser Datenstruktur finden können, dann fällt er zurück auf den folgenden Code:

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

, die sein kann, was Sie sehen. Als ich das geschrieben habe, dachte ich, es wäre besser als 0 zurück zu geben. Wenn deine Font-Metriken gut aussehen und du denkst, dass es einen Fehler in CAM :: PDF gibt, zögere nicht, mich an post more details zu wenden.

+0

Danke für das Feedback Chris. Überprüfen Sie mein Update 2 in OP. Hoffe, was ich getan habe, war richtig, um die Breite zu bekommen. – Thushan

Verwandte Themen