[couverture de Linux Magazine 113]

Perles de Mongueurs (42)

Article publié dans Linux Magazine 113, février 2009.

[+ del.icio.us] [+ Developers Zone] [+ Bookmarks.fr] [Digg this] [+ My Yahoo!]

La perle de ce mois-ci a été rédigée par Sébastien "sdeseille" Deseille (sebastien.deseille@gmail.com).

Réduire la taille des pages d'un document PDF

Dans le cadre de mon travail j'ai été confronté à la nécessité de redimensionner des documents PDF qui étaient associés à des courriers. En effet, la société qui s'occupe de l'impression et de la mise sous plis des courriers ajoute des repères pour les besoins de son activité. Lorsqu'un pli se voit composé d'un document scanné au format PDF avec un fond en pleine page A4 ; il devient difficile pour le système d'identifier les repères.

Par chance toute la chaîne d'édition des courriers avant leur envoi chez l'imprimeur est gérée par des scripts en Perl. Mieux encore, c'est moi qui assurais la maintenance évolutive et corrective de ces scripts. On ne le répétera jamais assez : CPAN est ton ami. À moins que ce ne soit Google. Bref, j'ai recherché sur http://search.cpan.org/, pour ceux du fond qui n'ont pas suivi, un module d'édition de document PDF.

C'est là qu'intervient PDF::API2. Il ne doit pas vous être inconnu si vous avez lu la perle numéro 35 sur la suppression d'une page d'un fichier PDF. Je ne reviendrai pas sur ce que permet de faire ce module. Il faut retenir que c'est un vrai couteau suisse du format de fichier PDF.

PDF::API2

J'ai donc besoin de créer un document PDF au format A4 à partir de chacune des pages, de mon document original, réduites d'un pourcentage suffisant pour identifier les repères ajoutés par l'imprimeur.

Nous allons voir qu'il suffit de quelques méthodes bien choisies de PDF::API2 pour arriver à nos fins.

Voici le programme complet :

    #!/usr/bin/perl -w
    use strict;
    use warnings;
    use PDF::API2;

    # on prend en entrée le nom du fichier PDF passé en argument
    my $pdf_input  = $ARGV[0];
    my $pdf_output = $pdf_input . ".pdf";

    my $new_pdf = PDF::API2->new;
    my $old_pdf = PDF::API2->open($pdf_input);
    my $num_page=1;

    my $x_position = 10;
    my $y_position = 20;
    my $ratio=0.8;

    my $nb_pages = $old_pdf->pages();

    # on boucle sur toutes les pages du document original
    while ( $num_page <= $nb_pages ) {

        # on crée le form xobject à partir de chaque page
        my $form_xobject = $new_pdf->importPageIntoForm($old_pdf,$num_page);

        # ajoute une page au nouveau document PDF
        my $page = $new_pdf->page;

        # on spécifie une taille A4 soit 21cm par 29.7cm
        $page->mediabox('A4');

        # on crée un conteneur graphique
        my $gfx = $page->gfx;

        # on positionne dans le conteneur notre form xobject réduit
        $gfx->formimage( $form_xobject, $x_position, $y_position, $ratio );
        $num_page++;
    }

    # on enregistre notre nouveau fichier PDF
    $new_pdf->saveas("$pdf_output");

    # on fait le ménage en mémoire
    $new_pdf->end();
    $old_pdf->end();

Conclusion

Le programme ci-dessus ne sert bien sûr qu'à illustrer les fonctionnalités qui ont été mises en pratique dans mon exemple. Je laisse le soin au lecteur de se créer une routine qui répondrait à ses besoins personnels.

À la rédaction de cette perle, j'ai constaté qu'il était toujours possible de sélectionner les blocs de texte présents dans les documents PDF réduits. J'étais persuadé que les documents PDF étaient convertis en image. On garde donc un fichier PDF avec les propriétés qui le caractérise. Toujours utile à savoir, lorsque l'on a des documents PDF dont on souhaite modifier le contenu.

Références

À vous !

Envoyez vos perles à perles@mongueurs.net, elles seront peut-être publiées dans un prochain numéro de Linux Magazine.

[IE7, par Dean Edwards] [Validation du HTML] [Validation du CSS]