2017-09-28 113 views
0

我想用iText7將內容添加到現有的PDF中。我已經能夠創建新的PDF並使用段落和表格添加內容給他們。但是,一旦我重新打開我創建的PDF並嘗試向其中寫入更多內容,新內容將開始覆蓋舊內容。我希望新內容在舊內容之後附加到文檔中。我怎樣才能做到這一點?使用iText7和Java生成PDF

編輯

這是設置將與做一個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(); 
} 

這是怎麼了添加內容到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; 
} 

當我去執行這個第二類,這似乎是治療原文件,就好像它是空白。然後將新的段落寫在原始內容的頂部。我知道我錯過了一些東西,只是不確定那是什麼。

+0

你試過了什麼(顯示關鍵代碼),究竟是如何失敗(覆蓋第一個現有頁面或最後一個頁面上的內容)? – mkl

+0

@mkl我用你的建議編輯了我的問題 – hubertw

回答

0

每次需求都重新打開文檔?如果保持文檔處於打開狀態,則可以根據需要添加儘可能多的內容,而不必處理重疊問題的內容。

如果它的一個要求,那麼你將不得不自己跟蹤最後一個免費內容的位置並將其重置爲新的DocumentRenderer

A Rectangle就足以存儲剩餘在最後一頁上的空閒區域。右鍵關閉文檔之前,保存自由區在一些Rectangle以下列方式:

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

之後,當你不得不重新打開該文檔,先跳轉到最後一頁:

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

然後重置從以前的時候,你處理的文件留下的自由佔地面積:

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

之後,你可以自由的新內容添加到文檔中,它將出現在保存的位置:

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

請注意,這種方法的工作原理,如果你知道哪些文件你正在處理(即您可以將最後一個「空閒」位置與文檔ID相關聯),並且該文檔在您的環境之外不會更改。如果情況並非如此,我建議您查看內容提取,尤其是PdfDocumentContentParser。它可以幫助您提取頁面上的內容並確定它佔據的位置。然後,您可以計算頁面上的空閒區域,並使用上述的document.getRenderer().getCurrentArea().setBBox方法將DocumentRenderer指向寫入內容的正確位置。