iTextSharp-更改可选内容组的顺序

本文关键字:顺序 iTextSharp- | 更新日期: 2023-09-27 18:00:14

我有一个带有层次结构的PDF文件(也称为OCG)。使用以下代码片段

var ocProps = reader.Catalog.GetAsDict(PdfName.OCPROPERTIES);
var occd = ocProps.GetAsDict(PdfName.D);
var order = occd.GetAsArray(PdfName.ORDER);

我可以从源文件中查询当前订单。但我不知道如何修改这些数据,以便将其复制到具有以下片段的新文件中。

var reader = new PdfReader(input);
var document = new Document(reader.GetPageSizeWithRotation(1));
var pdfCopyProvider = new PdfCopy(document,
    new System.IO.FileStream(output, System.IO.FileMode.Create));            
document.Open();
// TBD do OCG modification ...
var importedPage = pdfCopyProvider.GetImportedPage(reader, 1);
pdfCopyProvider.AddPage(importedPage);
document.Close();

尽管如此,ocg信息在默认情况下被复制到新的pdf文件中。几周前,我看到布鲁诺·洛阿吉关于ocgs合并的评论https://stackoverflow.com/questions/21573892/itextsharp-merge-impose-pdfs-while-maintaining-layers-optional-content-groups但我不确定这是否也包括简单的复制。

欢迎对此提供任何提示。ocg的合并可能是未来的一个主题,因此对该主题的提示也是受欢迎的

谨致问候,Holger

添加:我使用的是最新版本5.5.0.0

已添加:除了Bruno的答案,我还发布了C#版本的manipulatePdf方法

public void ManipulatePdf(string source, string destination)
    {
        var reader = new PdfReader(source);
        var ocProps = reader.Catalog.GetAsDict(PdfName.OCPROPERTIES);
        var occd = ocProps.GetAsDict(PdfName.D);
        var order = occd.GetAsArray(PdfName.ORDER);
        var nestedLayers = (PdfObject)order[0];
        var nestedLayerArray = (PdfObject)order[1];
        var groupedLayers = (PdfObject)order[2];
        var radiogroup = (PdfObject)order[3];
        order[0] = radiogroup;
        order[1] = nestedLayers;
        order[2] = nestedLayerArray;
        order[3] = groupedLayers;
        var stamper = new PdfStamper(reader, new System.IO.FileStream(destination, System.IO.FileMode.Create));
        stamper.Close();
        reader.Close();
    }

iTextSharp-更改可选内容组的顺序

您已经非常接近解决方案了。请参阅ChangeOCGOrder,了解如何将ocg.pdf更改为ocg_reordered.pdf

你已经有了这样的东西:

PdfDictionary catalog = reader.getCatalog();
PdfDictionary ocProps = catalog.getAsDict(PdfName.OCPROPERTIES);
PdfDictionary occd = ocProps.getAsDict(PdfName.D);
PdfArray order = occd.getAsArray(PdfName.ORDER);

这很好:你看对地方了!

现在你需要这样的东西:

PdfObject nestedLayers = order.getPdfObject(0);
PdfObject nestedLayerArray = order.getPdfObject(1);
PdfObject groupedLayers = order.getPdfObject(2);
PdfObject radiogroup = order.getPdfObject(3);
order.set(0, radiogroup);
order.set(1, nestedLayers);
order.set(2, nestedLayerArray);
order.set(3, groupedLayers);

在我的示例中,ORDER数组包含4个元素。我得到这四个元素,并更改原始数组中条目的顺序。

注意,我也可以做一些类似的事情:

order.addFirst(order.remove(3));

这将具有与上面的8行代码相同的效果,但这8行代码有助于您理解机制。