使用writeSelectedRows的iText PDF表错误

时间:2013-01-09 18:26:36

标签: java pdf itext

我有下一个错误。 我尝试使用具有特定格式的iText创建PDF。我选择在页面的每个部分使用表格,因为我需要做的格式有表格。好吧,我已经做了所有事情,我创建表并使用doc.add(table)方法添加它,这很好用,但我需要将表设置为特定位置。所以我选择使用table.writeSelectedRows()方法,这很好用。

这是错误,这是我的代码:

table_SectionTwo.addCell(cell_White);
                table_SectionTwo.addCell(cell_White);
                table_SectionTwo.addCell(p);
                table_SectionTwo.addCell(cell_OrderDate);   
                table_SectionTwo.addCell(cell_CustomerOrderDate);
                table_SectionTwo.addCell(cell_OrderNumberSection);                                                              

    float[] columnWidths = new float[] {38f, 105f, 90f};
                    table_SectionTwo.setTotalWidth(columnWidths);
                    table_SectionTwo.setLockedWidth(true);
                    table_SectionTwo.completeRow();                 
                    table_SectionTwo.writeSelectedRows(0, -1, 260f, 770f, super.getPdfWriter().getDirectContent());                     
                    doc.add(table_SectionTwo);

如您所见,如果我执行此代码,则会添加相同的表2次

问题是当我删除doc.add(table)时,我这样做只是为了使用table.writeSelectedRows()将一个表添加到特定位置。这就是我的代码仍然存在的方式:

table_SectionTwo.writeSelectedRows(0, -1, 260f, 770f, super.getPdfWriter().getDirectContent());                     
//super.addTable(table_SectionTwo);

我评论过doc.add(table)。 这应该只写一个表。但这并不奏效。当我这样做时抛出:

ExceptionConverter: java.io.IOException: The document has no pages.
    at com.itextpdf.text.pdf.PdfPages.writePageTree(PdfPages.java:113)
    at com.itextpdf.text.pdf.PdfWriter.close(PdfWriter.java:1217)
    at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:777)
    at com.itextpdf.text.Document.close(Document.java:398)
    at PDFConstructor.CloseDocument(PDFConstructor.java:85)
    at InvoicePDF.CloseDocument(InvoicePDF.java:58)
    at Demo.main(Demo.java:72)

奇怪的是,当我评论doc.add(table)这不起作用时,当我评论table.writeSelectedRows()doc.add(table)工作正常。 仅当我doc.add(table)注释且table.writeSelectedRows()取消注释时才会出现此错误。

请帮帮我..

2 个答案:

答案 0 :(得分:0)

虽然您没有在问题中提供足够的信息,但我认为问题的原因是您没有定义表格的宽度。

进行此测试:询问桌子的总高度。如果iText返回0,那么您忘记定义表的宽度;如果它没有返回0,那么iText知道宽度是因为你明确地定义了它,或者因为你使用了document.add(table),它根据文档对象的页面指标计算了表的维度。

如果其他内容正在发挥作用,您必须提供更多信息。

答案 1 :(得分:0)

我从你的问题中理解你想要将特定的行写入文档但是在指定的位置。如果这是正确的,那么super.getPdfWriter()。getDirectContent())是否必要?我不这么认为。分析这部分我需要你的整个代码片段或这段代码的演示版本,解释相同。

第二:内部itext也使用PdfContentByte使用PdfPRow&写入PdfPTable。还记得根据作者(Bruno),itext是基于Builder Pattern构建的。如果以前的行没有任何意义,你可以跳过它。

即使在设置了所有必需属性之前,您目前也在向表中添加内容。

table_SectionTwo.addCell(cell_White);
table_SectionTwo.addCell(cell_White);
table_SectionTwo.addCell(p);
table_SectionTwo.addCell(cell_OrderDate);   
table_SectionTwo.addCell(cell_CustomerOrderDate);
table_SectionTwo.addCell(cell_OrderNumberSection);  

会是这样的

float[] columnWidths = new float[] {38f, 105f, 90f};
PdfPTable table_SectionTwo= new PdfPTable(clmnWdthTpHdr);
table_SectionTwo.setTotalWidth(500.0f);
table_SectionTwo.setWidthPercentage(100.0f);
table_SectionTwo.setLockedWidth(true);

3.不要使用super.getPdfWriter()。getDirectContent())。由于上面的代码显示我正在使用文档所以我认为你也必须编写以下代码片段(像这样:lol)

PdfWriter pdfWrtr=null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document doc= new Document(UtilConstant.pageSizePdf,0,0,0,0);
pdfWrtr=PdfWriter.getInstance(doc,baos);

在try catch中使用pdfWrtr.getDirectContent();代替。 这些都是基于我的代码分析。 另外还有一点是异常

ExceptionConverter: java.io.IOException: The document has no pages.
    at com.itextpdf.text.pdf.PdfPages.writePageTree(PdfPages.java:113)
...............................
 at InvoicePDF.CloseDocument(InvoicePDF.java:58)
    at Demo.main(Demo.java:72)

当没有任何内容添加到文档时,这是一个典型的错误。可能在步骤4中抛出(并忽略)异常(根据Itext in Action),并且你可能正在执行第5步(document.close())(尽管步骤4)中有例外。所以请附上Demo.java 如果上述内容不够清楚,无法帮助您。