How to flatten already filled out PDF form using iTextSharp

半世苍凉 提交于 2019-11-30 12:06:49
Feliciano Montoya

When creating the files to be merged, I changed this setting: pdfStamper.FormFlattening = true;

Works Great.

Just setting .FormFlattening on PdfStamper wasn't quite enough...I ended up using a PdfReader with byte array of file contents that i used to stamp/flatten the data to get the byte array of that to put in a new PdfReader. Below is how i did it. works great now.

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

I think this problem is same with this one: AcroForm values missing after flattening

Based on the answer, this should do the trick:

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

This is the same answer as the accepted one but without any unused variables:

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();
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!