iTextsharp 和 pdf 操作的问题



我得到一个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。

最新更新