Forum Astuces.divers [Perl] Modifier un PDF avec PERL

Posté par  .
Étiquettes : aucune
0
1
juin
2006
Dernièrement, j'ai eu besoin de modifier un grand nombre de documents PDF, en ajoutant un en-tête et un numéro de page sur chaque page. J'ai pu réaliser cette opération rapidement en utilisant Perl et le module PDF::API2. Voici une version "light" du script Perl que j'ai utilisé :


#!/usr/bin/perl
use PDF::API2;

my $file=shift;
my $out_file=shift||"test.pdf";
my $page_cnt=shift||1;

my $pdf = PDF::API2->open($file);

my $f1=$pdf->corefont('Times-Roman',-encode => "latin1");
my $f2=$pdf->corefont('Times-Italic',-encode => "latin1");

for my $p (1..$pdf->pages()){
my $page=$pdf->openpage($p);
$page->add_font($f1);
$page->add_font($f2);
my $gfx = $page->gfx;
$gfx->save;
$gfx->fillcolor('black');
$gfx->textstart;
# Ajout du numéro de page centré en bas
$gfx->font($f1,10);
$gfx->translate(297.5,30);
$gfx->text_center("$page_cnt");
# Ajout de l'entete en haut à droite
$gfx->font($f2,10);
$gfx->translate(570,812);
$gfx->text_right("Texte placé en haut à droite");
$gfx->textend;
$gfx->restore;
$page_cnt++;
}

$pdf->saveas($out_file);
exit;

Vous pouvez aussi placer dans la boucle les instructions suivantes pour afficher en arriere plan de chaques page le mot "TOP-SECRET" en rouge et en diagonal :

my $gfx2 = $page->gfx(1);
$gfx2->save;
$gfx2->fillcolor('red');
$gfx2->translate(297.5,420);
$gfx2->rotate(30);
$gfx2->font($f1,80);
$gfx2->text_center("TOP SECRET");
$gfx2->textend;
$gfx2->restore;

( c'est le (1) de l'appel de $page->gfx(1) qui permet la mise en arrière plan de texte)

Pour finir un dernier exemple qui permet d'ajouter un logo (logo.jpg) en haut à gauche sur toutes les pages :

#!/usr/bin/perl
use PDF::API2;

my $file = shift;
my $out_file = shift||"test.pdf";

my $pdf = PDF::API2->open($file);
my $nb_pages = $pdf->pages();

my $img = $pdf->image_jpeg('logo.jpg');

for my $p (1..$nb_pages){
my $page=$pdf->openpage($p);
my $gfx = $page->gfx(1);
$gfx->save;
$gfx->image($img,40,790,0.4); # 0.4 est le facteur d'echelle
$gfx->restore;
}

$pdf->saveas($out_file);



P.S.: Si PDF::API2 n'est pas déja installé sur votre système, vous pouvez utiliser la commande :
perl -MCPAN -e "install PDF::API2"
pour l'installer.
  • # PHP

    Posté par  . Évalué à 1.

    La même chose peut être effectuée sous PHP avec les librairies fpdf et fpdi.
    http://www.fpdf.org/
    http://fpdi.setasign.de/
  • # bouh

    Posté par  (site web personnel) . Évalué à 2.

    justement, ton astuce est aussi lisible qu'un script perl...
  • # Plus lisible !

    Posté par  . Évalué à 1.

    Intéressant, mais semble y avoir eu un léger problème de mise en page entre le moment où tu as écrit ton astuce et son arrivée dans la rubrique astuce, non ?
    Je pense que le résultat aurait dû ressembler à ça :


    Dernièrement, j'ai eu besoin de modifier un grand nombre de documents PDF, en ajoutant un en-tête et un numéro de page sur chaque page.
    J'ai pu réaliser cette opération rapidement en utilisant Perl et le module
    PDF::API2.
    Voici une version "light" du script Perl que j'ai utilisé :


    #!/usr/bin/perl

    use PDF::API2;

    my $file=shift;
    my $out_file=shift||"test.pdf";
    my $page_cnt=shift||1;
    my $pdf = PDF::API2->open($file);
    my $f1=$pdf->corefont('Times-Roman',-encode => "latin1");
    my $f2=$pdf->corefont('Times-Italic',-encode => "latin1");

    for my $p (1..$pdf->pages()){
        my $page=$pdf->openpage($p);
        $page->add_font($f1);
        $page->add_font($f2);
        my $gfx = $page->gfx;
        $gfx->save; $gfx->fillcolor('black');
        $gfx->textstart;
        
        # Ajout du numéro de page centré en bas
        $gfx->font($f1,10);
        $gfx->translate(297.5,30);
        $gfx->text_center("$page_cnt");
        
        # Ajout de l'entete en haut à droite
        $gfx->font($f2,10);
        $gfx->translate(570,812);
        $gfx->text_right("Texte placé en haut à droite");
        
        $gfx->textend;
        $gfx->restore;
        $page_cnt++;
    }

    $pdf->saveas($out_file);
    exit;

    Vous pouvez aussi placer dans la boucle les instructions suivantes pour afficher en arriere plan de chaques page le mot "TOP-SECRET" en rouge et en diagonal :

        my $gfx2 = $page->gfx(1);
        $gfx2->save;
        $gfx2->fillcolor('red');
        $gfx2->translate(297.5,420);
        $gfx2->rotate(30);
        $gfx2->font($f1,80);
        $gfx2->text_center("TOP SECRET");
        $gfx2->textend;
        $gfx2->restore;

    (c'est le (1) de l'appel de $page->gfx(1) qui permet la mise en arrière plan de texte)


    Pour finir un dernier exemple qui permet d'ajouter un logo (
    logo.jpg) en haut à gauche sur toutes les pages :

    #!/usr/bin/perl

    use PDF::API2;

    my $file = shift;
    my $out_file = shift||"test.pdf";
    my $pdf = PDF::API2->open($file);
    my $nb_pages = $pdf->pages();
    my $img = $pdf->image_jpeg('logo.jpg');
    for my $p (1..$nb_pages){
        my $page=$pdf->openpage($p);
        my $gfx = $page->gfx(1);
        $gfx->save;
        $gfx->image($img,40,790,0.4); # 0.4 est le facteur d'echelle
        $gfx->restore;
    }
    $pdf->saveas($out_file);


    P.S.: Si PDF::API2 n'est pas déja installé sur votre système, vous pouvez utiliser la commande : perl -MCPAN -e "install PDF::API2" pour l'installer.

    « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.