2017-06-26 112 views
0

在我的項目中,需要以PDF格式導出一些數據集。如何導出使用pdf模板和itext的數據集?

我瞭解到iText很有用,PdfpTable可以完成這項工作,但它需要大量代碼來處理樣式。雖然使用PDF模板可以節省調整樣式的時間和代碼,但我只能在模板中設置某些字段。

你能給我一些建議,使用像foreach這樣的命令來顯示數據集嗎?提前致謝!

下面是使用pdfpTable我的代碼,它所做的工作,但代碼是有點醜:

PdfPTable pdfTable = createNewPDFTable();  
    for (int i = 0; i < dataSet.size(); i++) { 
       MetaObject metaObject = SystemMetaObject.forObject(dataSet.get(i)); 
       for (String field : fields) { 
        Phrase phrase = new Phrase(String.valueOf(metaObject.getValue(field) != null ? metaObject.getValue(field) : "") 
          , PDFUtil.createChineseSong(DEFAULT_CELL_FONT_SIZE)); 
        PdfPCell fieldCell = new PdfPCell(phrase); 
        fieldCell.setBorder(Rectangle.NO_BORDER); 
        fieldCell.setFixedHeight(DEFAULT_COLUMN_HEIGHT); 
        fieldCell.setHorizontalAlignment(Element.ALIGN_CENTER); 
        fieldCell.setVerticalAlignment(Element.ALIGN_MIDDLE); 
        pdfTable.addCell(fieldCell); 
       } 
      } 

這裏有一些代碼使用pdfp模板,這是從iText的例子複製的工作尚未完成,因爲我還沒有找到正確的方式來顯示數據集。

PdfReader reader = new PdfReader(src); 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
     AcroFields form = stamper.getAcroFields(); 
     form.setField("text_1", "Bruno Lowagie"); 
     form.setFieldProperty("text_1", "setfflags", PdfFormField.FF_READ_ONLY, null); 

回答

1

您的問題存在不一致。你寫:PdfpTable可以做這項工作,但它需要很多代碼來處理樣式。但是,在您的第一個代碼片段中,您並不是按照預期的方式創建PDF文件。您可以使用PdfPTable創建模板,而不是生成大量完成的PDF。我假設你然後使用該模板創建大量完成的PDF。

如果您想使用模板並在之後填充它,則不應使用iText創建表單。手動創建它,例如使用Open Office或Libre Office。例如見我書中的chapter 6(第6.3.5節)。使用具有GUI的工具創建模板,然後使用iText多次填寫該模板。

這種方法有一些不足之處:所有內容必須符合您定義的字段。所有字段在固定頁面上都有固定的位置。

如果「通過代碼應用樣式」是一個問題,您可能需要遵循ZUGFRD數據手冊中描述的方法。在這本書中,我們首先創建了HTML:Creating HTML invoices

獲得HTML後,將HTML轉換爲PDF,然後使用CSS應用樣式:Creating PDF invoices

這就是我們如何創建一個ZUGFeRDDocument

ZugferdDocument pdfDocument = new ZugferdDocument(
    new PdfWriter(fos), ZugferdConformanceLevel.ZUGFeRDComfort, 
    new PdfOutputIntent("Custom", "", "http://www.color.org", 
     "sRGB IEC61966-2.1", new FileInputStream(INTENT))); 
pdfDocument.addFileAttachment(
    "ZUGFeRD invoice", dom.toXML(), "ZUGFeRD-invoice.xml", 
    PdfName.ApplicationXml, new PdfDictionary(), PdfName.Alternative); 
pdfDocument.setTagged(); 

HtmlConverter.convertToPdf(
    new ByteArrayInputStream(html), pdfDocument, getProperties()); 

getProperties()方法是這樣的:

public ConverterProperties getProperties() { 
    if (properties == null) { 
     properties = new ConverterProperties() 
      .setBaseUri("resources/zugferd/"); 
    } 
    return properties; 
} 

你可以找到關於如何使用HTML到PDF這裏其他的例子:pdfHTML add-on(讀introduction)。

請注意,您正在使用舊版本的iText。我分享的例子是使用iText 7. iText 5和iText 7有很大的區別。

+0

感謝您的回覆。也許我沒有清楚地描述這個問題,PdfpTalbe的第一個片段是我目前使用的,它已經完成了整個工作,並且我想用PDF模板來替換第一種方式,但由於我沒有完成工作,所以工作還沒有完成沒有找到適當的方式來顯示數據集。使用HTML是一個很好的建議,我會試一試。 –

+0

我不明白(而且我還是不明白)爲什麼你在'PdfPTable'中使用表單域。我只是使用'PdfPTable'並用數據填充(不包含表單域)。 –

+0

我不使用PdfpTalbe中的表單域,我只想使用PDF模板和表單文件來替換PdfpTale。 –

相關問題