java使用JavaFX将图像放在PDF文件上
我已经设法使用Apache的Javafx和PDFbox将文本放入pdf文件中。现在,我正在尝试将拍摄场景屏幕截图的图像放入pdf文档中
WritableImage snapshot = quotes.getScene().snapshot(null);
PDDocument doc = null;
PDPage page = null;
PDXObjectImage ximg = null;
BufferedImage bufferedImg = SwingFXUtils.fromFXImage(snapshot, null);
try{
doc = new PDDocument();
page = new PDPage();
doc.addPage(page);
PDPageContentStream content = new PDPageContentStream(doc, page);
/* ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = new ByteArrayInputStream(out.toByteArray());*/
ximg = new PDJpeg(doc, bufferedImg);
//ximg = new PDJpeg(doc, in);
content.drawImage(ximg, 100, 100);
content.close();
doc.save("PDFWithText.pdf");
doc.close();
} catch (Exception e){
System.out.println(e);
}
当我使用InputStream和OutputStream类时,会创建文档,但当我打开文档时,Adobe和其他程序会给我一个错误,说Acrobat无法正确显示页面。当我使用上面代码中注释掉的BuffereImage类时,文档很简单,没有创建,我不知道为什么
注意
这是Taking a screenshot of a scene or a portion of a scene in JavaFx 2.2的后续问题,但具体针对pdf创建部分,而不是节点快照部分
# 1 楼答案
这不是一个实际的解决方案(因为提供的代码不起作用),而是我试图解决问题的文档
我花了一些时间试图解决这个问题,但未能解决。我已经为我的解决方案提供了示例代码,因为它提供了一种SSCCE和方法,可以帮助其他试图解决这个问题的人
我尝试的两种方法是:
通过JavaFX方法SwingFXUtils获取BuffereImage输出。并将其作为pdfbox api的输入
这种方法不起作用,因为SwingFXUtils创建的BuffereImage是使用SampleModel编码的,该SampleModel与pdfbox api所需的不兼容
通过JavaFX方法SwingFXUtils从BuffereImage输出创建Jpeg流(使用ImageIO)。并将其作为pdfbox api的输入
这种方法不起作用。失败的原因可能是ImageIO从SwingFXUtils创建的BuffereImage创建了粉色(即编码错误的)JPEG。这可能是ImageIO中的一个错误。此外,我使用pdfbox将结果图像添加到jpeg中的方式可能存在缺陷
推荐
还有许多其他API可以从JavaFX创建PDF文件。与其继续解决JavaFX与pdfbox输出的图像集成问题,我建议尝试使用其他任何API来执行创建pdf文件的任务(谷歌搜索会发现它们)
可执行示例代码
# 2 楼答案
通过将图像转换为PNG并首先将其写入Outputstream,然后将转换后的PNG从Outputstream读取到BuffereImage,我将快照转换为PDF格式
最终的BuffereImage在PDJpeg中呈现良好,没有任何问题
这是我的密码