当前位置: 首页 > 知识库问答 >
问题:

如何使用PDFBOX生成分层pdf文件?

伍皓
2023-03-14

我有一个问题,生成一个分层的pdf页面使用PDFbox。我在这里看到过几篇关于这个主题的文章,但它们都集中在将页面从另一个pdf导入到目标文档中。

我创建了一个类MapImage,它包含纸张大小(以像素为单位)和一个我想要添加到单个pdf页面的BufferedImages列表。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PDDocument document = new PDDocument();
for (MapImage image : images) {
    PDPage page = new PDPage(new PDRectangle(image.getPaperWidth(), image.getPaperHeight()));
    page.setResources(new PDResources(new COSDictionary()));
    document.addPage(page);

    LayerUtility layerUtility = new LayerUtility(document);
    int i=1;
    for(BufferedImage layer : image.getLayers()) {
        PDJpeg img = new PDJpeg(document, layer);                        
        layerUtility.appendFormAsLayer(page, new PDXObjectForm(img.getCOSStream()), new AffineTransform(), "Layer " + i++);
    }
}
document.save(baos);
document.close();

不幸的是,生成的PDF已损坏。我试图创建一个页面,只有一个图像(没有图层),但不幸的是,我不知道如何做到这一点。

有人遇到过这样的问题吗?

共有1个答案

郏稳
2023-03-14

好吧,我解决了。这就是我想要的方法。可能对某人有用:)

public static PDOptionalContentGroup appendImageAsLayer(PDDocument document, PDPage targetPage, BufferedImage image, String layerName) throws IOException {
    PDDocumentCatalog catalog = document.getDocumentCatalog();
    PDOptionalContentProperties ocprops = catalog.getOCProperties();
    if (ocprops == null) {
        ocprops = new PDOptionalContentProperties();
        catalog.setOCProperties(ocprops);
    }
    if (ocprops.hasGroup(layerName)) {
        throw new IllegalArgumentException("Optional group (layer) already exists: " + layerName);
    }

    PDOptionalContentGroup layer = new PDOptionalContentGroup(layerName);
    ocprops.addGroup(layer);

    PDResources resources = targetPage.findResources();
    if(resources == null ) {
        resources = new PDResources(new COSDictionary());
        targetPage.setResources(resources);
    }
    PDPropertyList props = resources.getProperties();
    if (props == null) {
        props = new PDPropertyList();
        resources.setProperties(props);
    }

    // Find first free resource name with the pattern "MC<index>"
    int index = 0;
    PDOptionalContentGroup ocg;
    COSName resourceName;
    do {
        resourceName = COSName.getPDFName("MC" + index);
        ocg = props.getOptionalContentGroup(resourceName);
        index++;
    } while (ocg != null);
    // Put mapping for our new layer/OCG
    props.putMapping(resourceName, layer);
    PDJpeg img = new PDJpeg(document, image);

    PDPageContentStream contentStream = new PDPageContentStream(document, targetPage, true, false);
    contentStream.beginMarkedContentSequence(COSName.OC, resourceName);
    contentStream.drawImage(img, 0, 0);
    contentStream.endMarkedContentSequence();
    contentStream.close();

    return layer;
}
 类似资料:
  • 在我的项目中,我需要在Apache pdfbox api的帮助下生成发票。到目前为止,我可以在生成的pdf中插入图像、文本,但在生成表格时发现困难。我甚至找不到一个示例模板。如果有人有,请提供链接。 注意:我不必使用iText 提前感谢

  • 我有一个大的pdf打印文件,它包含5544页,大约36MB大小。该文件由MS Word 2010创建,仅包含文本和每个信件/文档上的徽标。 我将它拆分为5544个文件,然后根据关键字合并成2770个字母。每个字母约为。140-145kb。 当我将所有的字母合并到一个新的pdf打印文件(仍然包含5544页)时,文件的大小增长到396MB。 所有文本提取、拆分和合并都是通过从PHP调用Apache P

  • 问题内容: 我想使用命令 将一个PDF拆分为许多其他PDF。但是我发现有一个问题:拆分的PDF为“ ActiveMQ In Action(Manning-2011).pdf”,它的大小为14.1MB。但是当我跑步时 每个PDF都大于79MB!我该如何预防? 问题答案: 这是PDFBox 2.0.2中的一个已知错误。拆分在2.0.1中工作正常,在2.0.3中又可以工作。“错误的”代码已经恢复。问题的

  • 问题内容: 我正在使用Apache PDFBox处理Java应用程序中的PDF文件。我想在每个页面上分割一个PDF文档。 是否有可能做到这一点Apache PDFBox?如果是这样,怎么办? 问题答案: 可以使用来实现。 这是一个示例代码,它将在每个页面上拆分文档: 您可以使用来控制每个拆分的PDF的页数。

  • 我正在尝试缩放pdf文件,就像复印机中的缩放功能一样,它可以按百分比缩放文档(如下所示:https://inspectapedia.com/graphics/Safari_Page_Setup.jpg),我正在使用pdfbox管理我的pdf文件。我尝试过这个代码,但为什么它不起作用?代码中没有错误。 有人知道为什么该代码不起作用吗? 编辑 我需要它在API 16上工作