如何合并多个具有相同图层名称的 PDF 并获得较短的输出图层列表
How to merge multiple PDFs with same layer names and get a shorter layer list for the output
我正在使用 iText 将多个 PDF 与图层合并。每个 pdf 文件包含两层:'Cut' 和 'Crease'.
代码:
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 包含正确的内容。但是,层列表包含许多名称相似的层。
我可以更改一些代码,使合并后的文件只包含两层:'Cut' 和 'Crease' 吗?
使用下面的代码,我可以删除图层名称后缀。
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 文件中的图层名称。
您可以在 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))) {
[...]
}
我正在使用 iText 将多个 PDF 与图层合并。每个 pdf 文件包含两层:'Cut' 和 'Crease'.
代码:
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 包含正确的内容。但是,层列表包含许多名称相似的层。
我可以更改一些代码,使合并后的文件只包含两层:'Cut' 和 'Crease' 吗?
使用下面的代码,我可以删除图层名称后缀。
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 文件中的图层名称。
您可以在 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))) {
[...]
}