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

C# iTextSharp-可选内容组的更改顺序,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我有一个分层的PDF文件(又名OCG)。使用以下代码段 var ocProps = reader.Catalog.GetAsDict(PdfName.OCPROPERTIES); var occd = ocProps.GetAsDict(PdfName.D); var order = occd.GetAsArray(PdfName.ORDER); 我可以从源文件中查询当前订单。但我不知道如何修改这些数据,以便将其复制到具有以下代码段的新文件中 var reader = new PdfReade

我有一个分层的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文件中。几周前,我看到布鲁诺·洛瓦吉(Bruno Lowagie)关于OCG合并的评论,但我不确定这是否也包括简单的复制

任何关于这方面的暗示都是欢迎的。OCG的合并可能是未来的一个主题,因此关于该主题的提示也很受欢迎

问候,, 霍尔格

补充:我使用的是最新版本5.5.0.0

增加: 除了Bruno的回答之外,我还发布了C版本的ManufacturePDF方法

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();
    }

您已经非常接近解决方案。请参阅以了解如何更改为。(代码是用Java编写的,但将其移植到…VB.NET时应该不会有任何问题?)

你已经有过这样的经历:

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);
这很好:你找对地方了

现在你需要这样的东西:

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行代码有助于理解机制。

谢谢,布鲁诺。完美一击!我无法理解顺序的数组结构。(这是C#不是VB.NET)