gpt4 book ai didi

java - 如何使用 pdfbox 在另一个 PDPage 中插入一个 PDPage

转载 作者:搜寻专家 更新时间:2023-11-01 01:34:04 26 4
gpt4 key购买 nike

我使用处理等不同工具来创建 vector 图。这些图被写成单页或多页 pdf。我想使用 pdfbox 将这些图包含在一个类似报告的 pdf 中。

我当前的工作流程包括这些 pdf 作为带有以下伪代码的图像

PDDocument inFile = PDDocument.load(file);
PDPage firstPage = (PDPage) inFile.getDocumentCatalog().getAllPages().get(0);
BufferedImage image = firstPage.convertToImage(BufferedImage.TYPE_INT_RGB, 300);
PDXObjectImage ximage = new PDPixelMap(document, image);

PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawXObject(ximage, 0, 0, ximage.getWidth(), ximage.getHeight());
contentStream.close();

虽然这可行,但它失去了 vector 文件格式的优势,尤其是文件/大小与打印质量。

是否可以使用 pdfbox 将其他 pdf 页面作为嵌入对象包含在页面中(不作为单独的页面添加)?我可以吗?使用 PDStream?我更喜欢像 pdflatex 这样的解决方案能够将 pdf 图形嵌入到新的 pdf 文档中。

对于该任务,您可以推荐哪些其他 Java 库?

最佳答案

Is it possible to use pdfbox to include other pdf pages as embedded objects within a page

应该是可以的。 PDF 格式允许使用所谓的表单 xobjects 作为此类嵌入对象。不过,我没有看到明确的实现,但该过程与 PageExtractorPDFMergerUtility 所做的非常相似。

使用 PDFBox 2.0.0 开发版本的当前快照从 PageExtractor 派生的概念证明:

PDDocument source = PDDocument.loadNonSeq(SOURCE, null);
List<PDPage> pages = source.getDocumentCatalog().getAllPages();

PDDocument target = new PDDocument();
PDPage page = new PDPage();
PDRectangle cropBox = page.findCropBox();
page.setResources(new PDResources());
target.addPage(page);

PDFormXObject xobject = importAsXObject(target, pages.get(0));
page.getResources().addXObject(xobject, "X");

PDPageContentStream content = new PDPageContentStream(target, page);
AffineTransform transform = new AffineTransform(0, 0.5, -0.5, 0, cropBox.getWidth(), 0);
content.drawXObject(xobject, transform);
transform = new AffineTransform(0.5, 0.5, -0.5, 0.5, 0.5 * cropBox.getWidth(), 0.2 * cropBox.getHeight());
content.drawXObject(xobject, transform);
content.close();

target.save(TARGET);
target.close();
source.close();

此代码将源文档的第一页作为 XObject 导入到目标文档中,并使用不同的缩放和旋转转换将其两次放到页面上,例如对于这个来源

Source PDF, page 1

它创造了这个

Target PDF

实际执行导入的辅助方法 importAsXObject 定义如下:

PDFormXObject importAsXObject(PDDocument target, PDPage page) throws IOException
{
final PDStream src = page.getContents();
if (src != null)
{
final PDFormXObject xobject = new PDFormXObject(target);

OutputStream os = xobject.getPDStream().createOutputStream();
InputStream is = src.createInputStream();
try
{
IOUtils.copy(is, os);
}
finally
{
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}

xobject.setResources(page.findResources());
xobject.setBBox(page.findCropBox());

return xobject;
}
return null;
}

如上所述,这只是概念验证,尚未考虑极端情况。

关于java - 如何使用 pdfbox 在另一个 PDPage 中插入一个 PDPage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com