我得到一个pdf文档(没有密码(,它是从第三方软件生成的,其中包含javascript和一些可编辑的字段。如果我用pdfReader类加载这个pdf文档,尽管pdf文档有17页,但NumberOfPagesProperty始终为1。奇怪的是,如果我之后保存流,该文档有 17 页。当我现在尝试打开文档时,Acrobat Reader 会显示扩展功能警告,并且字段不再可填写(我尚未拼合文档(。有谁知道这样的问题?
背景信息:我的工作是删除javascript代码,填写一些字段,然后保存文档。我正在使用iTextsharp版本5.5.3.0。
不幸的是,我无法上传示例文件,因为其中有一些可靠的数据。
private byte[] GetDocumentData(string documentName)
{
var document = String.Format("{0}{1}\{2}.pdf", _component.OutputDirectory, _component.OutputFileName.Replace(".xml", ".pdf"), documentName);
if (File.Exists(document))
{
PdfReader.unethicalreading = true;
using (var originalData = new MemoryStream(File.ReadAllBytes(document)))
{
using (var updatedData = new MemoryStream())
{
var pdfTool = new PdfInserter(originalData, updatedData) {FormFlattening = false};
pdfTool.RemoveJavascript();
pdfTool.Save();
return updatedData.ToArray();
}
}
}
return null;
}
//Old version that wasn't working
public PdfInserter(Stream pdfInputStream, Stream pdfOutputStream)
{
_pdfInputStream = pdfInputStream;
_pdfOutputStream = pdfOutputStream;
_pdfReader = new PdfReader(_pdfInputStream);
_pdfStamper = new PdfStamper(_pdfReader, _pdfOutputStream);
}
//Solution
public PdfInserter(Stream pdfInputStream, Stream pdfOutputStream, char pdfVersion = ' ', bool append = true)
{
_pdfInputStream = pdfInputStream;
_pdfOutputStream = pdfOutputStream;
_pdfReader = new PdfReader(_pdfInputStream);
_pdfStamper = new PdfStamper(_pdfReader, _pdfOutputStream, pdfVersion, append);
}
public void RemoveJavascript()
{
for (int i = 0; i <= _pdfReader.XrefSize; i++)
{
PdfDictionary dictionary = _pdfReader.GetPdfObject(i) as PdfDictionary;
if (dictionary != null)
{
dictionary.Remove(PdfName.AA);
dictionary.Remove(PdfName.JS);
dictionary.Remove(PdfName.JAVASCRIPT);
}
}
}
扩展功能警告是一个提示,即原始PDF已使用使用权限签名进行签名以"启用阅读器",即告诉Adobe Reader在打开它时激活一些附加功能,并且OP对其的操作使签名无效。
事实上,他使用
_pdfStamper = new PdfStamper(_pdfReader, _pdfOutputStream);
这将创建一个完全重新生成文档的PdfStamper
。但是,为了不使签名无效,必须使用附加模式,就像OP的固定代码一样(对于char pdfVersion = ' ', bool append = true
(:
_pdfStamper = new PdfStamper(_pdfReader, _pdfOutputStream, pdfVersion, append);
如果我用pdfReader类加载这个pdf文档,尽管pdf文档有17页,但NumberOfPagesProperty始终为1。奇怪的是,该文件有17页
它很可能是一个带有XFA形式的PDF,即PDF只是Adobe Reader构建这17页的一些XFA数据的载体。在这种情况下,实际的PDF通常只包含一个页面,上面写着"如果你看到这个,你的查看器不支持XFA"。
但是,对于最终裁决,必须检查PDF。