-1

我有下一个错误。我正在尝试使用 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()取消评论时才会出现此错误。

请帮我..

4

2 回答 2

0

我从您的问题中了解到您想在指定位置写入特定行来记录文档。如果这是正确的 super.getPdfWriter().getDirectContent()) 是必要的吗?我不这么认为。分析这部分我需要您的整个代码片段或此代码的演示版本,它们解释相同。

第二:在内部 itext 也使用 PdfContentByte 使用 PdfPRow 编写 PdfPTable 并且还记得根据作者(Bruno)itext 是建立在 Builder 模式上的。如果前面的行对你没有意义,请跳过它。

您当前甚至在设置所有必需属性之前就将内容添加到表中。

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以帮助您。

于 2013-01-12T17:30:32.037 回答
0

尽管您在问题中没有提供足够的信息,但我认为问题是由于您没有定义表格的宽度造成的。

做这个测试:询问桌子的总高度。如果 iText 返回 0,那么您忘记定义表格的宽度;如果它不返回 0,那么 iText 知道宽度是因为您明确定义了它,或者因为您使用了 document.add(table),它根据文档对象的页面度量计算了表格的尺寸。

如果还有其他事情在起作用,您将不得不提供更多信息。

于 2013-01-10T08:09:05.577 回答