2010-11-01 6 views
3

Je souhaite créer un objet PdfWriter et définir des événements pour l'en-tête et le pied de page. Le problème est que cela fonctionne si je crée un nouveau PDF. Mais mon problème est que j'ai déjà un PDF dans Output Stream. Veuillez trouver mon exemple de code ci-dessous.PdfWriter et événements

Document document = new Document(); 
    try { 
     // step 2: 
     FileInputStream is = new FileInputStream("D://2.pdf"); 
     int nRead; 
     byte[] data = new byte[16384]; 
     ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
     while ((nRead = is.read(data, 0, data.length)) != -1) { 
      buffer.write(data, 0, nRead);   
     } 

     buffer.flush(); 
     PdfWriter writer = PdfWriter.getInstance(document,buffer); 
     writer.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft); 
     writer.setPageEvent(new DossierPortalUtil()); 

     document.setMargins(36, 36, 54, 72); 
     // step 3: 
     document.open(); 

     document.add(new Chunk("testing")); 

    } catch (Exception de) { 
     de.printStackTrace(); 
    } 
    finally{ 
     document.close(); 
    } 

Si je commente la ligne

document.add(new Chunk("testing")); 

-je obtenir une exception

Exception dans le thread "principal" ExceptionConverter: java.io.IOException: Le document n'a pas de pages.

Sans commenter il n'y a aucune exception mais il n'ajoute pas l'en-tête et le pied de page. Tous les indices sont très appréciés.

Cordialement, Tina

enter code here 

Répondre

3

Yep.

Vous essayez de modifier un fichier PDF existant avec PdfWriter, alors que vous devriez utiliser PdfStamper.

Ajout de texte avec une matrice est beaucoup moins trivial que cela avec PdfWriter et Document.

Vous devez créer un objet ColumnText et obtenir un PdfContentByte en appelant le myStamper.getOverContent(pageNum).

Vous ajoutez les paragraphes/morceaux/etc au ColumnText, et passez le PdfContentByte (et quelques paramètres de position) pour dessiner le texte.

Vous pouvez créer un fichier PDF séparé avec votre texte (et rien d'autre), puis utilisez PdfStamper & PdfImportedPage importer ces pages et les écrire au-dessus de ceux qui existent déjà. Les arrière-plans de page PDF sont transparents jusqu'à ce que vous dessinez quelque chose sur eux, de sorte que le texte (et d'autres choses) apparaîtra au-dessus de la page existante. Ceci est sensiblement moins efficace, car le deuxième document doit être converti en un tableau d'octets en syntaxe PDF (si vous utilisez un ByteArrayOutputStream au lieu d'écrire dans un fichier, ce qui serait encore plus lent), analysé à nouveau, puis ajouté à le document original et écrit une deuxième fois.

Cela vaut la peine de faire un petit effort supplémentaire pour utiliser ColumnText.

Vous devrez également écrire votre en-tête et pied de page directement avec PdfContentByte appels, mais vous devez le faire déjà dans votre PdfPageEvent, donc ces changements devraient être assez simples.

+0

Merci Mark. Je l'ai fait fonctionner. Mais maintenant, le problème auquel je suis confronté est - Il n'écrit pas l'en-tête. Bien que je fasse un getOverContent un getUnderContent, puis ajouter des tables, mais en quelque sorte l'en-tête n'est pas écrit. Des suggestions là-bas? –