在 java 中使用 itext 对齐 PDF 中的内容
Align content in PDF using itext in java
这个问题困扰我有一段时间了。我正在向文档绘制 pie chart
并显示 jtable data
。我无法 align
pdf file
中的内容。如何将 jtable data
和 pie chart
与此 pdf
对齐。我在下面用 image
提到了我的 code
。
如您所见,我需要将我的 jtable data
稍微对齐到顶部,并且它还必须适合 page
.
的 width
private void graphical_to_pdf() {
graph_table.setSize(graph_table.getPreferredSize());
JTableHeader th = graph_table.getTableHeader();
th.setSize(th.getPreferredSize());
PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 800, 800, 0.65f);
com.itextpdf.text.Font f = new com.itextpdf.text.Font(com.itextpdf.text.Font.FontFamily.TIMES_ROMAN, 18.0f, com.itextpdf.text.Font.NORMAL, BaseColor.BLACK);
Document doc = new Document(new com.itextpdf.text.Rectangle(900, 900));
//Creating a paper to store the jtable contents
Paper paper = new Paper();
paper.setSize(800, 800);
paper.setImageableArea(0, 100, 800, 800);
PageFormat pf = new PageFormat();
pf.setPaper(paper);
Printable printable = graph_table.getPrintable(JTable.PrintMode.NORMAL, null, null);
try {
PdfWriter writer;
writer = PdfWriter.getInstance(doc, new FileOutputStream(save_pdf.getSelectedFile().getAbsoluteFile() + ".pdf"));
writer.setViewerPreferences(PdfWriter.PageLayoutSinglePage);
doc.open();
int width = 375;
int height = 300;
JFreeChart chart = create_pie_chart_count();
doc.add(new Paragraph("Some TExt", f));
doc.add(new Paragraph("Some Text", f));
doc.add(new Paragraph("Document Generated On - " + generatedDate, f));
BufferedImage bufferedImage = chart.createBufferedImage(width, height);
Image image = Image.getInstance(writer, bufferedImage, 1.0f);
image.scalePercent(100f);
image.setAlignment(image.MIDDLE);
doc.add(image);
PdfAction action = PdfAction.gotoLocalPage(1, pdfDest, writer);
writer.setOpenAction(action);
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
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(650, 225);
result = printable.print(g2, pf, page);
g2.dispose();
cb.restoreState();
page++;
doc.newPage();
}
} while (result == Printable.PAGE_EXISTS);
g.dispose();
} catch (Exception e) {
} finally {
doc.close();
}
}
查看以下问题的答案:How to position a PDFGraphis2D object in iText?
如您所见,通常而不是 将图表或table 等对象直接绘制到直接内容。相反,您应该创建一个 PdfTemplate
来绘制。使用 PdfTemplate
的好处之一是您可以将其包装在 Image
中。不用担心:如果 PdfTemplate
包含矢量数据,则 Image
将是矢量图像;它不会被光栅化(这会导致分辨率下降)。
拥有 Image
个对象后,可以使用许多不同的选项来调整它们的大小、位置和组织它们。阅读以下问题的答案时,您可以了解不同的选项:
- How to display image and text beside each other Itext
- itextsharp images are not coming next to one another
- Add text and an alligned image to a ColumnText Itext
- ...
这个问题困扰我有一段时间了。我正在向文档绘制 pie chart
并显示 jtable data
。我无法 align
pdf file
中的内容。如何将 jtable data
和 pie chart
与此 pdf
对齐。我在下面用 image
提到了我的 code
。 jtable data
稍微对齐到顶部,并且它还必须适合 page
.
width
private void graphical_to_pdf() {
graph_table.setSize(graph_table.getPreferredSize());
JTableHeader th = graph_table.getTableHeader();
th.setSize(th.getPreferredSize());
PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 800, 800, 0.65f);
com.itextpdf.text.Font f = new com.itextpdf.text.Font(com.itextpdf.text.Font.FontFamily.TIMES_ROMAN, 18.0f, com.itextpdf.text.Font.NORMAL, BaseColor.BLACK);
Document doc = new Document(new com.itextpdf.text.Rectangle(900, 900));
//Creating a paper to store the jtable contents
Paper paper = new Paper();
paper.setSize(800, 800);
paper.setImageableArea(0, 100, 800, 800);
PageFormat pf = new PageFormat();
pf.setPaper(paper);
Printable printable = graph_table.getPrintable(JTable.PrintMode.NORMAL, null, null);
try {
PdfWriter writer;
writer = PdfWriter.getInstance(doc, new FileOutputStream(save_pdf.getSelectedFile().getAbsoluteFile() + ".pdf"));
writer.setViewerPreferences(PdfWriter.PageLayoutSinglePage);
doc.open();
int width = 375;
int height = 300;
JFreeChart chart = create_pie_chart_count();
doc.add(new Paragraph("Some TExt", f));
doc.add(new Paragraph("Some Text", f));
doc.add(new Paragraph("Document Generated On - " + generatedDate, f));
BufferedImage bufferedImage = chart.createBufferedImage(width, height);
Image image = Image.getInstance(writer, bufferedImage, 1.0f);
image.scalePercent(100f);
image.setAlignment(image.MIDDLE);
doc.add(image);
PdfAction action = PdfAction.gotoLocalPage(1, pdfDest, writer);
writer.setOpenAction(action);
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
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(650, 225);
result = printable.print(g2, pf, page);
g2.dispose();
cb.restoreState();
page++;
doc.newPage();
}
} while (result == Printable.PAGE_EXISTS);
g.dispose();
} catch (Exception e) {
} finally {
doc.close();
}
}
查看以下问题的答案:How to position a PDFGraphis2D object in iText?
如您所见,通常而不是 将图表或table 等对象直接绘制到直接内容。相反,您应该创建一个 PdfTemplate
来绘制。使用 PdfTemplate
的好处之一是您可以将其包装在 Image
中。不用担心:如果 PdfTemplate
包含矢量数据,则 Image
将是矢量图像;它不会被光栅化(这会导致分辨率下降)。
拥有 Image
个对象后,可以使用许多不同的选项来调整它们的大小、位置和组织它们。阅读以下问题的答案时,您可以了解不同的选项:
- How to display image and text beside each other Itext
- itextsharp images are not coming next to one another
- Add text and an alligned image to a ColumnText Itext
- ...