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();
}
您已经非常接近解决方案了。请参阅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行代码有助于您理解机制。