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

时间:2009-12-21 20:15:22

标签: c# pdf itextsharp

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

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

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

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

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

由于

4 个答案:

答案 0 :(得分:10)

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

很棒。

答案 1 :(得分: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();
  }

答案 2 :(得分:5)

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

根据答案,这应该可以解决问题:

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

答案 3 :(得分:0)

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

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();
}