Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用iTextSharp展平已填写的PDF表单_C#_Pdf_Itextsharp - Fatal编程技术网

C# 如何使用iTextSharp展平已填写的PDF表单

C# 如何使用iTextSharp展平已填写的PDF表单,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我正在使用iTextSharp将多个pdf文件合并到一个文件中 我正在使用iTextSharp官方教程中描述的方法,它通过PdfWriter和PdfImportedPage一页一页地合并文件 事实证明,我需要合并的一些文件是由PDF表单填写的,使用这种合并表单数据的方法会丢失 我看到了几个使用PdfStamper填写表单并将其展平的示例 我找不到的是一种将已经填写好的PDF表单展平的方法,并希望在不保存展平版本的情况下将其与其他文件合并 谢谢在创建要合并的文件时,我更改了此设置: pdfStam

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

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

事实证明,我需要合并的一些文件是由PDF表单填写的,使用这种合并表单数据的方法会丢失

我看到了几个使用PdfStamper填写表单并将其展平的示例

我找不到的是一种将已经填写好的PDF表单展平的方法,并希望在不保存展平版本的情况下将其与其他文件合并


谢谢

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


非常好。

只是设置。PdfStamper上的FormFlatting还不够……我最终使用了一个带有文件内容字节数组的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();
  }

我认为这个问题和这个问题是一样的:

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

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

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

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

汪汪你可能有问题……这可能会帮助其他人,因为我遇到了一个问题,自由文本没有被压平,在这个问题上,iTextSharp有一个单独的设置:
stamper.freetextflating=true谢谢这帮我解决了一个类似的问题。像这样展平所有PDF是否安全,或者是否有方法检测哪些PDF需要此功能,哪些不需要此功能?添加
pdfStamper.AcroFields.generateapearances=true也让我的工作。比其他字节数组解决方案容易得多。像这样展平所有PDF是否安全,或者是否有方法检测哪些PDF需要此功能,哪些不需要此功能?