【问题标题】:Can't generate complete data to PDF file in java无法在java中生成完整的数据到PDF文件
【发布时间】:2015-04-22 05:30:57
【问题描述】:

我有一个jtable 用来显示一些数据。假设我有大约 200 行数据。我可以使用iText library 生成pdf,但我面临的问题是所有行都没有生成。如何动态添加new page 以便生成所有行?请看下面的代码,请在这里帮助我。

Document doc = new Document(new Rectangle(1350, 1450));
  PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 0, 800, 0.50f);
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    java.util.Date date = new java.util.Date();
    String generatedDate = formatter.format(date);try {

        PdfWriter writer;
        writer = PdfWriter.getInstance(doc, new FileOutputStream(save_pdf.getSelectedFile().getAbsoluteFile() + ".pdf"));
    writer.setViewerPreferences(PdfWriter.PageLayoutSinglePage);

        doc.open();

        PdfAction action = PdfAction.gotoLocalPage(1, pdfDest, writer);
        writer.setOpenAction(action);
        doc.add(new Paragraph("REPORTS", f));

        doc.add(new Paragraph("Document Generated On - " + generatedDate, f));

        PdfContentByte cb = writer.getDirectContent();

        cb.saveState();

              Graphics2D g2;

        g2 = cb.createGraphics(1350, 1275);
        Shape oldClip = g2.getClip();
        g2.clipRect(0, 0, 1350, 1275);//1275


        table1.print(g2);
        JTableHeader h = table1.getTableHeader();
        h.print(g2);

        g2.setClip(oldClip);
          writer.newPage();
        g2.dispose();
        cb.restoreState();

    } catch (DocumentException | FileNotFoundException e) {
    }
    doc.close();

【问题讨论】:

  • 我会考虑 JasperReports 甚至是 JTable#print 方法之一(并打印到 PDF)
  • 您可以通过表格的Printable“伪造”打印JTable,参见JTable#getPrintable
  • 我一定会通过Jasper Reports。但是没有其他选择吗?另外,我没有打印JTable。我只需要将Jtable 内容生成到pdf
  • 你有一个Graphics 上下文(我假设它是一个java.awt.Graphics),Printable 将接受一个Graphics 上下文,它可以为你做分页
  • Printable 将接受Graphics 上下文是什么意思?我只需要将jtable 数据生成为PDF 格式。

标签: java swing jtable itext


【解决方案1】:

好的,这是一个非常基本的例子......

JTable 已经支持打印,通过它的各种print 方法,基本上这归结为获取JTable Printable 接口的实例并将其传递给需要Graphics2D 的打印API绘制的上下文...

奇怪的是,你有一个Graphics2D 上下文,所以这里的技巧是“充当”打印机并自己调用JTablePrintable print 方法...

DefaultTableModel model = new DefaultTableModel(0, 10);
for (int row = 0; row < 400; row++) {
    Object[] values = new Object[10];
    for (int col = 0; col < 10; col++) {
        values[col] = ((char) ('A' + col)) + "x" + row;
    }
    model.addRow(values);
}

JTable table = new JTable(model);
table.setSize(table.getPreferredSize());

JTableHeader tableHeader = table.getTableHeader();
tableHeader.setSize(tableHeader.getPreferredSize());

Document doc = new Document(new Rectangle(1350, 1450));
PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 0, 800, 0.50f);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = new java.util.Date();
String generatedDate = formatter.format(date);

Paper paper = new Paper();
paper.setSize(1350, 1450);
paper.setImageableArea(10, 10, 1350 - 20, 1450 - 20);

PageFormat pf = new PageFormat();
pf.setPaper(paper);

Printable printable = table.getPrintable(JTable.PrintMode.NORMAL, null, null);
try {

    PdfWriter writer;
    writer = PdfWriter.getInstance(doc, new FileOutputStream("test.pdf"));
    writer.setViewerPreferences(PdfWriter.PageLayoutSinglePage);

    doc.open();

    // Use this to "test" if there is page
    // available for printing, otherwise it prints
    // a empty page and I can't figure out
    // how to remove it :P
    BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = img.createGraphics();

    Font f = new Font(Font.TIMES_ROMAN, 12f);
    int page = 0;
    int result = Printable.NO_SUCH_PAGE;
    PdfContentByte cb = writer.getDirectContent();
    do {

        result = printable.print(g, pf, page);

        if (result == Printable.PAGE_EXISTS) {

            cb.saveState();
            Graphics2D g2 = cb.createGraphics(1350, 1450);

            System.out.println(page);
            result = printable.print(g2, pf, page);

            g2.dispose();
            cb.restoreState();

            doc.add(new Paragraph("REPORTS", f));
            doc.add(new Paragraph("Document Generated On - " + generatedDate, f));

            page++;
            doc.newPage();

        }

    } while (result == Printable.PAGE_EXISTS);
    g.dispose();

} catch (DocumentException | PrinterException | FileNotFoundException e) {
    e.printStackTrace();
} finally {
    doc.close();
}

现在,我需要显示表格以显示行标题,但可能还有其他解决方法。

【讨论】:

  • 嘿,谢谢!这就像一个魅力,解决了我的问题。有很多关于Printable InterfaceJTable#getPrintable 方法的信息。 :)
  • 我的iText 非常糟糕,因为我们为 PDF、Excel 和打印机生成报告,所以我们只使用 JasperReports,但这应该会给你一个基本的想法
【解决方案2】:
PdfAction action = PdfAction.gotoLocalPage(1, pdfDest, writer);

在这里您只使用一页来编写内容。因此 iText 无法在下一页中写入内容。 gotoLocalPage 方法只作用于特定页面。请参考以下链接并更改您的代码...

Just gothrough this page

【讨论】:

  • 在哪里添加 document.newpage() ?如果我删除声明 PdfAction action = PdfAction.gotoLocalPage(1,pdfDest,writer); ,那么我的 pdf 将一无所获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2023-03-06
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多