iTextsharp和pdf操作的问题

时间:2014-12-08 13:36:11

标签: pdf itextsharp

我正在获取一个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);
        }
    }
}

1 个答案:

答案 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。