无法在 java 中生成完整数据到 PDF 文件
Can't generate complete data to PDF file in java
我有一个 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();
PdfAction action = PdfAction.gotoLocalPage(1, pdfDest, writer);
这里只用一页写内容。所以 iText 不能写下一页的内容。 gotoLocalPage方法只作用于特定页面。请参考以下 link 并更改您的代码...
好的,这是一个非常基本的例子...
JTable
已经支持打印,通过它的各种 print
方法,基本上这归结为获取 JTable
Printable
接口的实例并将其传递给打印 API,需要 Graphics2D
上下文来绘制...
奇怪的是,你有一个 Graphics2D
上下文,所以这里的技巧是 "act" 作为打印机并调用 JTable
的 Printable
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();
}
现在,我需要显示 table 才能显示行 headers,但可能还有其他解决方法。
我有一个 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();
PdfAction action = PdfAction.gotoLocalPage(1, pdfDest, writer);
这里只用一页写内容。所以 iText 不能写下一页的内容。 gotoLocalPage方法只作用于特定页面。请参考以下 link 并更改您的代码...
好的,这是一个非常基本的例子...
JTable
已经支持打印,通过它的各种 print
方法,基本上这归结为获取 JTable
Printable
接口的实例并将其传递给打印 API,需要 Graphics2D
上下文来绘制...
奇怪的是,你有一个 Graphics2D
上下文,所以这里的技巧是 "act" 作为打印机并调用 JTable
的 Printable
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();
}
现在,我需要显示 table 才能显示行 headers,但可能还有其他解决方法。