如何调整图形大小以适应 pdf 页面的大小 java
how to adapt the size of graphics to the size of a pdf page java
我正在尝试使用以下代码将图形保存为 pdf 文件:
if (jRadioButton1.isSelected()) {
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
PdfWriter writer = null;
try {
writer = PdfWriter.getInstance(document, new FileOutputStream("C:\Simulation_Report.pdf"));
} catch (FileNotFoundException | DocumentException ex) {
Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
}
document.open();
try {
document.add(new Paragraph("Simulation Report"));
} catch (DocumentException ex) {
Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
}
document.newPage();
try {
document.add(new Paragraph("Simulation"));
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
PdfTemplate pdfTemplate = cb.createTemplate(750,750);
Graphics2D g2 = pdfTemplate.createGraphics(750, 750);
Drawer drawer = new Drawer();
drawer.setSource(new File(jTextField1.getText()));
drawer.paintComponent(g2);
cb.addTemplate(pdfTemplate, 10, 10);
g2.dispose();
cb.restoreState();
} catch (DocumentException ex) {
Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
}
document.close();
但是当我打开保存的文件(pdf文件)时,我看不到全部图形,我只看到大约60%的图形,那么如何使图形的大小适应pdf页面A4
我该如何解决?!
您的代码中存在矛盾。
我明白了:
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
这意味着您正在创建一个大小为 595 x 842 用户单位的文档(默认情况下 1 个用户单位 = 1 点)。
但是,我还看到您创建了一个 PdfTemplate
来测量 750 x 750 个用户单元:
PdfTemplate pdfTemplate = cb.createTemplate(750,750);
然后您添加此模板,偏移量为 10 个用户单位:
cb.addTemplate(pdfTemplate, 10, 10);
如何解决这个矛盾?您有两个选择:
选项 1:根据您的图形调整页面:
我假设您希望每一边都有 10 个用户单位的边距,因此您的页面尺寸应至少为 770 x 770 个用户单位(750 用于容纳图像加上 10 乘以 2 的边距边)。
在这种情况下,您应该像这样创建文档:
Document document = new Document(new Rectangle(770, 770));
现在您正在创建一个文档,其页面与您要添加的图形的大小相对应。
选项 2:根据页面大小调整图形大小:
扔掉这段代码:
cb.saveState();
PdfTemplate pdfTemplate = cb.createTemplate(750,750);
Graphics2D g2 = pdfTemplate.createGraphics(750, 750);
Drawer drawer = new Drawer();
drawer.setSource(new File(jTextField1.getText()));
drawer.paintComponent(g2);
cb.addTemplate(pdfTemplate, 10, 10);
g2.dispose();
cb.restoreState();
替换为:
PdfTemplate pdfTemplate = cb.createTemplate(750,750);
Graphics2D g2 = pdfTemplate.createGraphics(750, 750);
Drawer drawer = new Drawer();
drawer.setSource(new File(jTextField1.getText()));
drawer.paintComponent(g2);
g2.dispose();
Image img = Image.getInstance(pdfTemplate);
img.scaleToFit(575, 822);
img.setAbsolutePosition(10, 10);
document.add(img);
如您所见,我们缩放图像,使其宽度(和高度)比页面小 20 个用户单位。那是因为您的代码表明您希望图像有 10 个用户单位的边距。现在我们确定图像适合页面(甚至留出至少 10 磅的边距)。
我们在 (10, 10)
处定义了绝对位置,这是您在 addTemplate()
方法中使用的坐标,我们将图像添加到文档中。
别担心:将 PdfTemplate
包裹在 Image
对象中不会栅格化图像。如果模板中包含矢量数据,则矢量数据将被保留。
我正在尝试使用以下代码将图形保存为 pdf 文件:
if (jRadioButton1.isSelected()) {
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
PdfWriter writer = null;
try {
writer = PdfWriter.getInstance(document, new FileOutputStream("C:\Simulation_Report.pdf"));
} catch (FileNotFoundException | DocumentException ex) {
Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
}
document.open();
try {
document.add(new Paragraph("Simulation Report"));
} catch (DocumentException ex) {
Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
}
document.newPage();
try {
document.add(new Paragraph("Simulation"));
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
PdfTemplate pdfTemplate = cb.createTemplate(750,750);
Graphics2D g2 = pdfTemplate.createGraphics(750, 750);
Drawer drawer = new Drawer();
drawer.setSource(new File(jTextField1.getText()));
drawer.paintComponent(g2);
cb.addTemplate(pdfTemplate, 10, 10);
g2.dispose();
cb.restoreState();
} catch (DocumentException ex) {
Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
}
document.close();
但是当我打开保存的文件(pdf文件)时,我看不到全部图形,我只看到大约60%的图形,那么如何使图形的大小适应pdf页面A4 我该如何解决?!
您的代码中存在矛盾。
我明白了:
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
这意味着您正在创建一个大小为 595 x 842 用户单位的文档(默认情况下 1 个用户单位 = 1 点)。
但是,我还看到您创建了一个 PdfTemplate
来测量 750 x 750 个用户单元:
PdfTemplate pdfTemplate = cb.createTemplate(750,750);
然后您添加此模板,偏移量为 10 个用户单位:
cb.addTemplate(pdfTemplate, 10, 10);
如何解决这个矛盾?您有两个选择:
选项 1:根据您的图形调整页面:
我假设您希望每一边都有 10 个用户单位的边距,因此您的页面尺寸应至少为 770 x 770 个用户单位(750 用于容纳图像加上 10 乘以 2 的边距边)。 在这种情况下,您应该像这样创建文档:
Document document = new Document(new Rectangle(770, 770));
现在您正在创建一个文档,其页面与您要添加的图形的大小相对应。
选项 2:根据页面大小调整图形大小:
扔掉这段代码:
cb.saveState();
PdfTemplate pdfTemplate = cb.createTemplate(750,750);
Graphics2D g2 = pdfTemplate.createGraphics(750, 750);
Drawer drawer = new Drawer();
drawer.setSource(new File(jTextField1.getText()));
drawer.paintComponent(g2);
cb.addTemplate(pdfTemplate, 10, 10);
g2.dispose();
cb.restoreState();
替换为:
PdfTemplate pdfTemplate = cb.createTemplate(750,750);
Graphics2D g2 = pdfTemplate.createGraphics(750, 750);
Drawer drawer = new Drawer();
drawer.setSource(new File(jTextField1.getText()));
drawer.paintComponent(g2);
g2.dispose();
Image img = Image.getInstance(pdfTemplate);
img.scaleToFit(575, 822);
img.setAbsolutePosition(10, 10);
document.add(img);
如您所见,我们缩放图像,使其宽度(和高度)比页面小 20 个用户单位。那是因为您的代码表明您希望图像有 10 个用户单位的边距。现在我们确定图像适合页面(甚至留出至少 10 磅的边距)。
我们在 (10, 10)
处定义了绝对位置,这是您在 addTemplate()
方法中使用的坐标,我们将图像添加到文档中。
别担心:将 PdfTemplate
包裹在 Image
对象中不会栅格化图像。如果模板中包含矢量数据,则矢量数据将被保留。