2017-09-28 5 views
0

J'essaie d'ajouter du contenu à un fichier PDF existant en utilisant iText7. J'ai pu créer de nouveaux fichiers PDF et leur ajouter du contenu en utilisant des paragraphes et des tableaux. Cependant, une fois que je vais rouvrir un fichier PDF que j'ai créé et que j'essaie d'y écrire davantage de contenu, le nouveau contenu remplace l'ancien contenu. Je souhaite que le nouveau contenu soit ajouté au document après l'ancien contenu. Comment puis-je atteindre cet objectif?Génération de PDF en utilisant iText7 avec Java

Modifier

Ceci est la classe qui met en place des méthodes communes qui seront exécutées à chaque changement effectué à un document PDF.

public class PDFParent { 

private static Document document; 

private static PdfWriter writer; 

private static PdfReader reader; 

private static PageSize ps; 

private static PdfDocument pdfDoc; 

public static Document getDocument() { 
    return document; 
} 

public static void setDocument(Document document) { 
    PDFParent.document = document; 
} 

public static void setupPdf(byte[] inParamInPDFBinary){ 
    writer = new PdfWriter(new ByteArrayOutputStream()); 

    try { 
     reader = new PdfReader(new ByteArrayInputStream(inParamInPDFBinary));   
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    pdfDoc = new PdfDocument(reader, writer); 

    ps = PageSize.A4; 
    document = new Document(pdfDoc, ps); 
} 

public static byte[] writePdf(){   
    ByteArrayOutputStream stream = (ByteArrayOutputStream) writer.getOutputStream();  
    return stream.toByteArray(); 
} 

public static void closePdf(){ 
    pdfDoc.close(); 
} 

Et voilà comment je suis d'ajouter le contenu au format pdf

public class ActAddParagraphToPDF extends PDFParent{ 

// output parameters 
public static byte[] outParamOutPDFBinary; 

public static ActAddParagraphToPDF mosAddParagraphToPDF(byte[] inParamInPDFBinary, String inParamParagraph) throws IOException { 
    ActAddParagraphToPDF result = new ActAddParagraphToPDF(); 

    setupPdf(inParamInPDFBinary); 

    //---------------------begin content-------------------// 

    getDocument().add((Paragraph) new Paragraph(inParamParagraph)); 

    //---------------------end content-------------------// 

    closePdf(); 

    outParamOutPDFBinary = writePdf(); 

    return result; 
} 

Quand je vais exécuter cette seconde classe, il semble traiter le document original comme si elle est vide. Puis écrit le nouveau paragraphe sur le contenu original. Je sais qu'il me manque quelque chose, mais je ne sais pas ce que c'est.

+0

Qu'avez-vous essayé (montrez le code pivot), comment cela a-t-il échoué (a-t-il écrasé le contenu sur la première page existante ou la dernière)? – mkl

+0

@mkl J'ai édité ma question avec vos suggestions – hubertw

Répondre

0

Est-ce que rouvrir le document chaque fois qu'une exigence? Si vous gardez le document ouvert, vous pouvez ajouter autant de contenu que vous le souhaitez et vous n'aurez pas à gérer les problèmes de chevauchement de contenu.

Si est une exigence, alors vous devrez suivre vous-même la dernière position de contenu libre et le réinitialiser à nouveau DocumentRenderer. Un Rectangle suffirait pour stocker la zone libre laissée sur la dernière page. Juste avant la fermeture du document, sauf la zone de libre dans certains Rectangle de la manière suivante:

Rectangle savedBbox = document.getRenderer().getCurrentArea().getBBox(); 

Après cela, lorsque vous devez rouvrir le document, le premier saut à la dernière page:

document.add(new AreaBreak(AreaBreakType.LAST_PAGE)); 

et puis réinitialiser la zone de libre occupée gauche depuis le point précédent vous avez traité le document:

document.getRenderer().getCurrentArea().setBBox(savedBbox); 

Après que vous êtes libre d'ajouter du nouveau contenu au document et apparaît à la position enregistrée:

document.add(new Paragraph("Hello again")); 

S'il vous plaît noter que cette approche fonctionne si vous savez les documents que vous avez affaire à (à savoir vous pouvez associer la dernière position "libre" avec l'ID du document) et ce document n'est pas modifié en dehors de votre environnement. Si ce n'est pas le cas, je vous recommande de regarder dans l'extraction de contenu et en particulier PdfDocumentContentParser. Il peut vous aider à extraire le contenu que vous avez sur la page et à déterminer les positions qu'il occupe. Ensuite, vous pouvez calculer la zone libre sur une page et utiliser l'approche document.getRenderer().getCurrentArea().setBBox que j'ai décrite ci-dessus pour pointer DocumentRenderer à l'endroit correct pour écrire le contenu.