【问题标题】:How to merge multiple PDFs with same layer names and get a shorter layer list for the output如何合并具有相同图层名称的多个 PDF 并为输出获取更短的图层列表
【发布时间】:2021-04-26 19:22:22
【问题描述】:

我正在使用 iText 将多个 PDF 与图层合并。每个 pdf 文件包含两层:“剪切”和“折痕”。

代码:

public void testMergePdfMerger() throws Exception {

    String[] srcPdfs = new String[]{
            resourceFile("pdf/4901.pdf"),
            resourceFile("pdf/4902.pdf"),
            // more files here...

    };

    String destPdf = targetFile("MergerSimple.pdf");

    try (PdfDocument tgt = new PdfDocument(new PdfWriter(destPdf))) {
        PdfMerger merger = new PdfMerger(tgt);
        for (String srcPdf : srcPdfs) {
            try (PdfDocument src = new PdfDocument(new PdfReader(srcPdf))) {
                merger.merge(src, 1, src.getNumberOfPages());

            }
        }
    }
}

目标 pdf 包含正确的内容。但是,图层列表包含许多名称相似的图层。

我可以更改一些代码,使合并后的文件只包含两层:“剪切”和“折痕”吗?

通过以下代码,我可以删除图层名称后缀。

        List<PdfLayer> layers = tgt.getCatalog().getOCProperties(false).getLayers();
        for(PdfLayer layer: layers) {
            String currentLayerName = layer.getPdfObject().get(PdfName.Name).toString();
            layer.setName(currentLayerName.replaceAll("_\\d+$", ""));
        }

但仍然不清楚如何重用第一个输入 pdf 文件中的图层名称。

【问题讨论】:

    标签: java pdf itext layer itext7


    【解决方案1】:

    您可以在PdfWriter 上设置smart mode 以启用资源重用(参见https://api.itextpdf.com/iText7/java/7.1.14/com/itextpdf/kernel/pdf/PdfWriter.html#setSmartMode-boolean-

    try (PdfDocument tgt = new PdfDocument(new PdfWriter(destPdf).setSmartMode(true))) {
        [...]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 2022-11-10
      相关资源
      最近更新 更多