2010-05-10 6 views
0

J'utilise iText pour générer à la fois des PDF et des RTF. Je sais que la génération RTF avec iText n'est pas populaire, mais j'ai encore besoin de faire fonctionner le code pour les deux. Techniquement, je peux avoir différents morceaux de code pour gérer chaque type, mais il doit pouvoir être contenu dans le même fichier/classe.Ajouter un en-tête au format PDF et RTF avec iText

Je peux travailler avec le code comme ceci:

String outputData = getFieldValue(myRecord, myFieldName); 
if (exportToPDF) { 
    iTextPdfPCell = new PdfPCell(pdfPTable.getDefaultCell()); 
    iTextPdfPCell.setPhrase(outputData); 
    pdfPTable.addCell(iTextPdfPCell); 
} 
if (exportToRTF) { 
    iTextCell = new RtfCell(outputData); 
    iTextTable.addCell(iTextCell); 
} 

je peux ajouter un en-tête en utilisant HeaderFooter qui apparaîtra sur PDF et RTF

Phrase headerPhrase = new Phrase ("This is a page header."); 
HeaderFooter header = new HeaderFooter(headerPhrase, false); 
iTextDoc.setHeader(header); 

Le problème est quand l'en-tête devient complexe. Je voudrais ajouter un en-tête qui contient une table et des images (les images peuvent être dans la table). J'ai vu un code sur un autre forum qui suggéraient de faire ceci:

Phrase headerPhrase = new Phrase(); 
headerPhrase.add(iTextTable); 
HeaderFooter header = new HeaderFooter(headerPhrase, false); 
iTextDoc.setHeader(header); 

Pendant que mon test initial montre que cela ne provoque pas de compilation des erreurs et techniquement « fonctionne », il commence la table d'en-tête dans la même position que le texte du corps du fichier, de sorte qu'ils se chevauchent. Lorsque je définis les marges de la page plus large pour permettre l'espace pour l'en-tête, il déplace simplement l'en-tête vers le bas avec le corps.

La plupart des informations que j'ai lues en ligne (et dans le manuel) semblent pointer vers l'utilisation d'événements de page, mais cela signifie que ma classe doit étendre PdfPageEventHelper. Si je fais cela,

1. Y a-t-il quelque chose de similaire pour le RTF?

2. Si oui, la même classe peut-elle étendre à la fois le 'RtfPageEventHelper' (s'il existe) et PdfPageEventHelper? Je ne peux pas écrire des classes séparées pour chaque type de sortie

3. Sinon, y a-t-il un moyen de pouvoir utiliser des tables/images dans la classe HeaderFooter, qui fonctionne déjà pour PDF et RTF?

4. (Je ne veux même pas demander cela) Puisque iText semble avoir laissé derrière lui la génération RTF, devrais-je utiliser autre chose pour générer des RTF (de préférence fonctionne aussi avec PDF)?

Répondre

0

Un en-tête ou un pied de page avec HeaderFooter est affiché sur chaque page. Si vous voulez simplement un en-tête de document ajoutez simplement un élément standard (paragraphe/etc) à la page avant votre contenu.

Par exemple, je fais avec mon document:

Paragraph Header = new Paragraph("Document Header", FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLDITALIC, new Color(0, 0, 0))); 

document.open(); 
document.add(Header); 
document.add(otherContent); 
document.close(); 
3

Je l'ai fait dans ce format. Est-ce pour RTF, mais je pense est le même avec PDF. Seulement changer RtfHeader pour PdfHeader

document.open(); 
Paragraph head=new Paragraph("Head"); 
Paragraph foot=new Paragraph("Foot"); 
HeaderFoot header=new RtfHeaderFooter(head); 
HeaderFoot footer=new RtfHeaderFooter(foot); 
document.setHeader(header); 
document.setFooter(footer); 
document.close(); 

J'attends de l'aide.

Questions connexes