2010-05-05 5 views
1

Imaginons que j'ai deux modèles PDF créés avec Adobe Acrobat, qui sont tous deux des documents d'une seule page, 8,5 x 11. Le premier modèle (A.pdf) contient du contenu pour la moitié supérieure de la page. Le deuxième modèle (B.pdf) contient du contenu pour la moitié inférieure de la page. (Il se trouve que le contenu des deux modèles ne se chevauche pas.)Fusion de deux modèles dans iText

Je voudrais utiliser iText pour prendre ces deux modèles et créer un seul modèle "fusionné" (C.pdf) ce n'est qu'une seule page (avec le contenu de A.pdf sur la moitié supérieure et le contenu de B.pdf sur la moitié inférieure).

(je ne veux pas « fusionner » ces deux fichiers dans un document de 2 pages. J'ai besoin du produit final à une seule page.)

Je vais courir iText dans un environnement de servlets (Tomcat 6) mais je ne pense pas que cela fasse une différence pour la réponse.

Est-ce possible?

Répondre

4

Je suis l'aide de Mark Storer sur le iText mailing list. La solution est d'obtenir PdfTemplate objets pour chaque fichier, puis utilisez la méthode addTemplate() pour les ajouter ensemble, par exemple:

PdfTemplate topOfPage = writer.getImportedPage(reader, 1); 
PdfTemplate bottomOfPage = writer.getImportedPage(reader, 2); 

PdfContentByte content = writer.getDirectContent(); 

// in PDF, "0, 0" is the lower left corner. 
content.addTemplate(bottomOfPage); 
content.addTemplate(topOfPage, 0, bottomOfPage.getHeight()); 
1
+0

Ceci semble spéculatif. Pouvez-vous décrire ce que le code fait et comment il s'applique à mon problème spécifique? C'est écrit d'une manière plutôt opaque. –

+0

Le programme ouvre un fichier PDF et génère un nouveau fichier PDF en plaçant dans chaque nouvelle page (disons) deux pages de l'original, avec rotation et/ou mise à l'échelle. Voir autour de la ligne 130. J'ai déjà écrit un programme similaire basé sur ce, pour reformater des fichiers pdf, pour l'affichage ou l'impression. Cela me semblait quelque peu lié à votre besoin. – leonbloy

+0

Le code semble ajouter des données dans des blocs de taille de page. Je veux juste ajouter des parties d'une page. –

0

un cas beaucoup plus utilisé est de fusionner un fond de page pdf avec une source multi-pages pdf fichier. Le fichier PDF d'arrière-plan contient uniquement un en-tête et un pied de page par exemple. Le fichier PDF source est déjà préparé avec des marges supérieure et inférieure en tant que marques de réservation pour l'en-tête et le pied de page du modèle pdf d'arrière-plan dans cette scène. Si vous cherchez cela - comme je l'ai fait - vous allez trébucher sur ce sujet ici et vous pouvez appliquer l'approche suivante:

tplFile$ = "c:/0/background.pdf" 
srcFile$ = "c:/0/source1.pdf" 
destFile$ = "c:/0/newMergedDest.pdf" 

declare Document destDoc! 
declare PdfWriter destWriter! 
declare PdfReader mainDocReader! 
declare PdfReader singlePageBackgroundReader! 
declare PdfImportedPage mainDocPage! 
declare PdfImportedPage backgroundPage! 
declare PdfContentByte dcb! 
declare PdfContentByte ucb! 

destDoc! = new Document() 
destWriter! = PdfWriter.getInstance(destDoc!, new FileOutputStream(destFile$)) 
destDoc!.open() 
dcb! = destWriter!.getDirectContent() 
ucb! = destWriter!.getDirectContentUnder() 
mainDocReader! = new PdfReader(srcFile$) 
singlePageBackgroundReader! = new PdfReader(tplFile$) 
backgroundPage! = destWriter!.getImportedPage(singlePageBackgroundReader!,1) 
for i=1 to mainDocReader!.getNumberOfPages() 
    destDoc!.newPage() 
    mainDocPage! = destWriter!.getImportedPage(mainDocReader!,i) 
    dcb!.addTemplate(mainDocPage!,0,0) 
    ucb!.addTemplate(backgroundPage!,0,0) 
next i 
destDoc!.close()