Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image iText PdfContentByte addTemplate位置不起作用_Image_Pdf_Positioning_Itext - Fatal编程技术网

Image iText PdfContentByte addTemplate位置不起作用

Image iText PdfContentByte addTemplate位置不起作用,image,pdf,positioning,itext,Image,Pdf,Positioning,Itext,我试图将位置设置为我添加到PDF中的图像,但它始终将位置设置为0,0。 我找了很多,但找不到解决办法。我想我不能很好地理解定位 这里的代码总是发布到0,0,但它应该是200300 非常感谢你的帮助 DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue(String.format("%s, %s", "pie1", "pie1"),20); dataset.setValue(String.format("%s,

我试图将位置设置为我添加到PDF中的图像,但它始终将位置设置为0,0。 我找了很多,但找不到解决办法。我想我不能很好地理解定位

这里的代码总是发布到0,0,但它应该是200300

非常感谢你的帮助

DefaultPieDataset dataset = new DefaultPieDataset();

dataset.setValue(String.format("%s, %s", "pie1", "pie1"),20);
dataset.setValue(String.format("%s, %s", "pie2", "pie2"),80);

JFreeChart chart = ChartFactory.createPieChart("testPie", dataset, true, true, false);

Document document = new Document();
document.addCreationDate();
document.setPageSize(PageSize.A4);

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("test.pdf")); 
document.open(); 

PdfContentByte cb = writer.getDirectContent();
PdfTemplate tp = cb.createTemplate(300, 300); 
Graphics2D g2 = cb.createGraphics(300, 300, new DefaultFontMapper()); 

Rectangle2D r2D = new Rectangle2D.Double(0, 0, 300, 300); 
chart.draw(g2, r2D, null); 
g2.dispose(); 
cb.addTemplate(tp, 200, 300); 
document.close(); 

你的模板是空的。。。您直接从作者的直接内容(CB.createGraphics,而不是您可能想要的TP.createGraphics)获取PdfGraphics2D

有几种解决方案:

选项1:从模板中获取图形2D

 Graphics2D g2 = tp.createGraphics(...)
选项2:放弃模板,直接在contentByte中移动图表。graphics2D接口有点笨重,因此只要可能,您通常应该更喜欢直接在contentByte中执行操作。它工作得很好,但是它构建的内容流没有它可能的那么高效。在这种情况下,我认为这无关紧要,但这是一个很好的经验法则

 cb.saveState();
 cb.concatMatrix(1, 0, 0, 1, 200, 300);
 Graphics2D g2 = cb.createGraphics(...);
 ...
 g2.dispose();
 cb.restoreState();
 document.close();
选项三:放弃模板并从Graphics2D实例中移动图表:

 g2.transform(AffineTransform.getTranslateInstance(200, 300));
 chart.draw(...);

非常感谢,非常感谢。我应该越来越多地研究itext。