Article publié dans Linux Magazine 113, février 2009.
La perle de ce mois-ci a été rédigée par Sébastien "sdeseille" Deseille
(sebastien.deseille@gmail.com
).
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.
On commence en douceur avec 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, comme
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();
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.
http://search.cpan.org/dist/PDF-API2/
La documentation de PDF::API2
.
Un site qui m'a permis de comprendre ce qu'était un form XObjects. Il apporte des explications sur la norme PostScript et PDF.
Perles de Mongueurs 35 : Supprimer une page d'un fichier PDF, par Philippe Bruhat, paru dans GNU/Linux Magazine n°97, septembre 2007.
http://articles.mongueurs.net/magazines/perles/perles-35.html
Envoyez vos perles à perles@mongueurs.net
, elles seront peut-être
publiées dans un prochain numéro de Linux Magazine.
Copyright © Les Mongueurs de Perl, 2001-2011
pour le site.
Les auteurs conservent le copyright de leurs articles.