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