【问题标题】:iText PDF Table error using writeSelectedRows使用 writeSelectedRows 的 iText PDF 表错误
【发布时间】:2013-01-09 18:26:35
【问题描述】:

我有下一个错误。 我正在尝试使用 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 次​​p>

问题是当我删除 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() 时才会出现此错误。

请帮帮我..

【问题讨论】:

    标签: java pdf itext


    【解决方案1】:

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

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

    如果有其他问题,您必须提供更多信息。

    【讨论】:

      【解决方案2】:

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

      2nd: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())。因为上面的代码告诉我你正在使用文档,所以我认为你也必须编写以下代码 sn-p(类似这样的东西: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 如果以上内容不够清楚,无法帮助您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多