首页 文章

如何使用iTextSharp压缩已填写的PDF表单

提问于
浏览
11

我正在使用iTextSharp将多个pdf文件合并到一个文件中 .

我正在使用iTextSharp官方教程中描述的方法,specifically here,它通过PdfWriter和PdfImportedPage逐页合并文件 .

原来我需要合并的一些文件是填写PDF表单并使用这种合并表单数据的方法丢失了 .

我看到几个使用PdfStamper填写表单并展平它们的例子 .

我找不到的,是一种压缩已填写的PDF表格的方法,希望将其与其他文件合并,而不保存它首先展平版本 .

谢谢

4 回答

  • 5

    创建要合并的文件时,我更改了此设置:pdfStamper.FormFlattening = true;

    效果很好 .

  • 8

    只是在PdfStamper上设置.FormFlattening还不够......我最终使用了PdfReader,其中包含文件内容的字节数组,用于标记/压平数据以获取其中的字节数组以放入新的PdfReader . 以下是我的表现 . 现在很棒 .

    private void AppendPdfFile(FileDTO file, PdfContentByte cb, iTextSharp.text.Document printDocument, PdfWriter iwriter) 
      {
         var reader = new PdfReader(file.FileContents);
    
         if (reader.AcroForm != null)
            reader = new PdfReader(FlattenPdfFormToBytes(reader,file.FileID));
    
         AppendFilePages(reader, printDocument, iwriter, cb);
      }
    
      private byte[] FlattenPdfFormToBytes(PdfReader reader, Guid fileID)
      {
         var memStream = new MemoryStream();
         var stamper = new PdfStamper(reader, memStream) {FormFlattening = true};
         stamper.Close();
         return memStream.ToArray();
      }
    
  • 0

    我认为这个问题与此问题相同:AcroForm values missing after flattening

    根据答案,这应该做的伎俩:

    pdfStamper.FormFlattening = true;
    pdfStamper.AcroFields.GenerateAppearances = true;
    
  • 10

    这与接受的答案相同,但没有任何未使用的变量:

    private byte[] GetUnEditablePdf(byte[] fileContents)
    {
        byte[] newFileContents = null;
    
        var reader = new PdfReader(fileContents);
    
        if (reader.AcroForm != null)
            newFileContents = FlattenPdfFormToBytes(reader);
    
        else newFileContents = fileContents;
    
        return newFileContents;
    }
    
    private byte[] FlattenPdfFormToBytes(PdfReader reader)
    {
        var memStream = new MemoryStream();
        var stamper = new PdfStamper(reader, memStream) { FormFlattening = true };
        stamper.Close();
        return memStream.ToArray();
    }
    

相关问题