【发布时间】:2017-02-21 15:26:52
【问题描述】:
一点背景知识:我正在使用 iTextSharp 预填充 Adobe Sign 字段并显示/隐藏相关图层。该 PDF 是在 InDesign 中创建并导出为带有 Acrobat 图层的 Adobe PDF(交互式)。
当尝试使用 {stamper}.GetPdfLayers() 访问图层时,我遇到了 KeyNotFoundException 抛出。
复制问题的来源:
string __sourceFileName = @"C:\Test\agreement.pdf";
string __destFileName = @"C:\Test\agreement - Updated.pdf";
using (FileStream outFile = new FileStream(__destFileName, FileMode.Create))
{
PdfReader pdfReader = new PdfReader(__sourceFileName);
PdfStamper pdfWriter = new PdfStamper(pdfReader, outFile);
var __layers = pdfWriter.GetPdfLayers();
pdfWriter.Close();
pdfReader.Close();
}
我下载了 iTextSharp 源码,并在“src\core\iTextSharp\text\pdf”的源码路径中的 PdfStamperImp.cs 第 1802 行的 AddOrder 函数中追踪到了这个错误。
具体错误发生在第 1808 行,其中使用了不存在的键来查询 Dictionary:
layer = ocgmap[obj.ToString()];
最简单的修复方法是将这一行更改为以下内容:
layer = (ocgmap.ContainsKey(obj.ToString())) ? ocgmap[obj.ToString()] : null;
一旦源被重建,PDF 图层就会返回而不会出现错误。 我希望这可以帮助遇到错误的其他人。
iTextSharp 源代码在 GitHub 上可用:https://github.com/itext/itextsharp
【问题讨论】:
-
当您提出并回答自己的问题时,您需要在适当的位置发布一个问题,然后是一个答案。当您点击“提问”按钮时,甚至可以选择执行此操作。请遵循网站的既定格式。
-
但除此之外,继续努力!为什么不同时向原始存储库提交拉取请求并修复错误?
-
谢谢,一定错过了。由于我不熟悉使用 GIT,因此将在下周按照指南进行拉取请求。