2009-03-06 3 views
1

-je utiliser ce qui suit pour lire un fichier PDF et d'obtenir des chaînes de texte d'une page:Comment puis-je obtenir la largeur et la hauteur d'une chaîne de texte avec 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; 

Maintenant, @text a toutes les chaînes de texte et commencer x, y de chaque chaîne de texte.

Comment puis-je obtenir la largeur (et éventuellement la hauteur) de chaque chaîne?

package MyRenderer est la suivante:

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

Mise à jour 1: Il y a une fonction GetStringWidth ($ FontMetrics, $ string) en CAM :: PDF. Bien qu'il y ait un paramètre $ fontmetrics dans cette fonction, indépendamment de ce que je passe à ce paramètre, la fonction renvoie la même valeur pour une chaîne donnée.

En outre, je ne suis pas sûr de l'unité de mesure utilisée par la valeur retournée.

Mise à jour 2: j'ai changé la fonction renderText à suivre:

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

Notez que, en plus d'obtenir la police et taille_police, je multipliai $ width avec la taille de la police pour obtenir la largeur réelle de la chaîne .

Maintenant, seule la hauteur est manquante. GetStringWidth() dépend fortement des métriques de police que vous fournissez.

Répondre

1

Si elle ne trouve pas la largeur des caractères dans cette structure de données, il retombe au code suivant:

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

qui peut être ce que vous voyez. Quand j'ai écrit ça, je pensais que c'était mieux que de retourner 0. Si vos statistiques de police semblent bonnes et vous pensez qu'il ya un bug dans CAM :: PDF, n'hésitez pas à post more details et je vais jeter un oeil.

+0

Merci pour les commentaires Chris. Vérifier ma mise à jour 2 dans OP. J'espère que ce que j'ai fait était juste pour obtenir la largeur. – Thushan