Catégorie : Programmation     Tags :      0 Commentaire

    Retrouvez cet article dans : Linux Magazine 113

    Depuis le numéro 59, les Mongueurs de Perl vous proposent tous les mois de découvrir les scripts jetables qu’ils ont pu coder ou découvrir dans leur utilisation quotidienne de Perl. Bref, des choses trop courtes pour en faire un article, mais suffisamment intéressantes pour mériter d’être publiées. Ce sont les perles de Mongueurs.

    1

    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 pli 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 du numéro 97 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.

    1.1

    PDF::API2

    J’ai donc besoin de créer un document PD

    PDF::API2 pour arriver à nos fins.

    open() et new(), afin d’ouvrir un document PDF existant et d’en créer un vide ;

    importPageIntoForm() : ça se complique un peu plus avec cette méthode. Elle permet d’importer une page d’un document dans un Form XObjects, en spécifiant le fichier original et le numéro de la page à importer. Ce qu’il faut comprendre, c’est que le Form XObjects décrit des objets de type texte, vecteur ou image à l’intérieur d’un fichier PDF. Cet objet peut ensuite être réutilisé, modifié autant de fois qu’on le souhaite dans le document.

    page : comme son nom l’indique, permet l’ajout d’une page dans le document.

    mediabox() : cette méthode définit la hauteur et la largeur de la page dans le document. On peut lui passer un format standard en argument, par exemple A4.

    gfx : on crée un objet de type graphique destiné à recevoir la page redimensionnée. Cet objet joue donc le rôle de conteneur.

    formimage() : on affecte au conteneur notre Form XObjects auquel on applique un ratio de réduction. La réduction s’effectue à partir des marges haute et droite. Il faut donc déplacer notre object en lui renseignant une marge basse et gauche pour le centrer sur la page. Cela se fait grâce aux arguments de position x et y passés à la méthode.

    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();

    2

    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érisent. Toujours utile à savoir, lorsque l’on a des documents PDF dont on souhaite modifier le contenu.

    Références

    http://search.cpan.org/dist/PDF-API2/
    La documentation de PDF::API2.

    http://www.prepressure.com/
    Un site qui m’a permis de comprendre ce qu’était un form XObjects. Il apporte des explications sur la norme PostScript et PDF.

    BRUHAT (Philippe), " Perles de Mongueurs : supprimer une page d’un fichier PDF ", GNU/Linux Magazine n°97, septembre 2007.
    http://articles.mongueurs.net/magazines/perles/perles-35.html

    À vous !

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

    Auteur : Sébastien " sdeseille " Deseille

    Retrouvez cet article dans : Linux Magazine 113

    Posté par (La rédaction) | Signature : Sébastien Deseille | Article paru dans Creative Commons License

    Laissez une réponse

    Vous devez avoir ouvert une session pour écrire un commentaire.