iTextsharp和pdf操作的问题

iTextsharp和pdf操作的问题,pdf,itextsharp,Pdf,Itextsharp,我得到了一个pdf文档,没有密码,它是由第三方软件生成的,里面有javascript和一些可编辑的字段。如果我使用pdfReader类加载此pdf文档,尽管pdf文档有17页,但NumberOfPagesProperty始终为1。奇怪的是,如果我以后保存流,文档有17页。当我现在尝试打开文档时,Acrobat Reader会显示一个扩展功能警告,并且字段不再可填充。我没有展平文档。有人知道这样的问题吗 背景资料: 我的工作是删除javascript代码,填写一些字段,然后保存文档。 我使用的是i

我得到了一个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 = '\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);
        }
    }
}
extended feature warning(扩展功能警告)是指原始PDF已使用使用权限签名进行签名,以使读卡器启用它,即在打开Adobe Reader时告诉它激活一些附加功能,并且OP对其进行的操作已使签名无效

事实上,他使用了

_pdfStamper = new PdfStamper(_pdfReader, _pdfOutputStream);
这将创建一个PdfStamper,它将完全重新生成文档。但是,为了不使签名无效,必须使用append模式,如OP的固定代码char pdfVersion='\0',bool append=true:

如果我使用pdfReader类加载此pdf文档,尽管pdf文档有17页,但NumberOfPagesProperty始终为1。奇怪的是,这份文件有17页

很可能它是一个带有XFA表单的PDF,也就是说,PDF只是一些XFA数据的载体,Adobe Reader可以从中构建这17个页面。在这种情况下,实际的PDF通常只包含一个页面,上面写着这样的话:如果您看到这个,您的查看器不支持XFA


不过,要做出最终结论,必须检查PDF。

一般来说:请提供一些源文件和PDF样本,以便其他人复制您的问题。要做出有根据的猜测:NumberOfPageProperty始终为1,尽管PDF文档有17页-很可能您的PDF带有XFA表单,也就是说,PDF只是一些XFA数据的一部分,AdobeReader可以根据这些数据构建17个页面。在这种情况下,实际PDF通常只包含一个页面,上面写着这样的话:如果您看到此内容,您的查看器不支持XFA。当我现在尝试打开文档时,Acrobat Reader会显示一个扩展功能警告-这通常表示原始PDF已使用使用使用权限签名进行签名,以启用它,即告诉Adobe Reader激活一些附加功能。如果在这样的文件上盖章,请使用附加模式。否则签名将被破坏。正如我在上一篇评论中猜测的,您不会在附加模式下使用PdfStamper。因此,您破坏了使用权签名。阅读更多。非常感谢,这是我一直在寻找的解决方案。
_pdfStamper = new PdfStamper(_pdfReader, _pdfOutputStream, pdfVersion, append);