我正在获取一个pdf文档(无密码),该文档是从第三方软件生成的,其中包含javascript和一些可编辑字段。如果我使用pdfReader类加载此pdf文档,则NumberOfPagesProperty始终为1,尽管pdf文档有17页。奇怪的是,如果我之后保存了流,那么该文档有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 = '\0', 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);
}
}
}
答案 0 :(得分:0)
扩展功能警告提示原始PDF已使用使用权限签名对其进行“读取”启用,即告诉Adobe Reader在打开时激活一些其他功能它,OP对它的操作使签名无效。
确实,他使用
进行操作_pdfStamper = new PdfStamper(_pdfReader, _pdfOutputStream);
创建一个完全重新生成文档的PdfStamper
。但是,要使签名无效,必须使用OP的固定代码中的附加模式(对于char pdfVersion = '\0', bool append = true
):
_pdfStamper = new PdfStamper(_pdfReader, _pdfOutputStream, pdfVersion, append);
如果我使用pdfReader类加载此pdf文档,则NumberOfPagesProperty始终为1,尽管pdf文档有17页。奇怪的是,该文件有17页
很可能它是带有XFA格式的PDF,即PDF只是某些XFA数据的载体,Adobe Reader构建这17页。在这种情况下,实际的PDF通常只包含一个页面,上面写着“如果你看到这个,你的观众不支持XFA。”
但是,对于最终判决,必须检查PDF。