代码之家  ›  专栏  ›  技术社区  ›  andryuha

如何使用ITextSharp扁平已填写的PDF表单

  •  11
  • andryuha  · 技术社区  · 15 年前

    我正在使用ITextSharp将许多PDF文件合并到一个文件中。

    我正在使用ITextSharp官方教程中描述的方法, specifically here 通过pdfwriter和pdfimportedpage逐页合并文件。

    结果发现我需要合并的一些文件是填写PDF表单的,使用这种合并表单数据的方法会丢失。

    我看到了几个使用pdfstamper填写表单并将其扁平化的示例。

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

    谢谢

    4 回复  |  直到 6 年前
        1
  •  10
  •   Michal Klouda    12 年前

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

    工作很好。

        2
  •  8
  •   andryuha    13 年前

    只是设置.formFlatting在pdfstamper上还不够……我最终使用了一个pdfrider,它具有文件内容的字节数组,我使用它来标记/展平数据,以获得要放入新pdfrider的字节数组。下面是我是如何做到的。现在工作得很好。

     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();
      }
    
        3
  •  5
  •   Moch Yusup    9 年前

    我认为这个问题和这个问题是一样的: AcroForm values missing after flattening

    根据答案,这应该可以做到:

    pdfStamper.FormFlattening = true;
    pdfStamper.AcroFields.GenerateAppearances = true;
    
        4
  •  0
  •   Gauravsa    6 年前

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

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