这是我之前的another question的后续问题,在PDF文件与表单字段合并成功后合并,如果出现具有相同名称的字段,那么他们没有从原始文档中获取其不同的值,它看起来像一个具有相同名称的字段将其值传播到以下具有相同名称的字段。
这是在两个单独的函数中合并和重命名的代码:
public byte[] MergeFiles(IList<DBForms> forms)
{
if (forms.Count < 1)
return null;
System.IO.MemoryStream msOutput = new System.IO.MemoryStream();
iTextSharp.text.Document document = new iTextSharp.text.Document();
PdfCopy copy = new PdfCopy(document, msOutput);
copy.SetMergeFields();
document.Open();
List<PdfReader> readers = new List<PdfReader>();
foreach (var docData in forms.Where(d => d.Status != 2))
{
PdfReader reader = new PdfReader(FlattenRenamePdfForm(docData.DocumentFile));
readers.Add(reader);
copy.AddDocument(reader);
}
document.Close();
foreach (PdfReader reader in readers)
{
reader.Close();
}
return msOutput.ToArray();
}
private byte[] FlattenRenamePdfForm(byte[] oldDoc)
{
PdfReader reader = new PdfReader(oldDoc);
using (MemoryStream ms = new MemoryStream())
{
using (PdfStamper stamper = new PdfStamper(reader, ms))
{
ICollection<string> keys = stamper.AcroFields.Fields.Keys;
List<string> keysCopy = new List<string>();
foreach (var key in keys)
{
keysCopy.Add(key);
}
foreach (var key in keysCopy)
{
stamper.AcroFields.SetFieldProperty(key, "setfflags", PdfFormField.FF_READ_ONLY, null);
stamper.AcroFields.RenameField(key, String.Format("{0}{1}", key, new Guid()));
}
stamper.Close();
}
reader.Close();
return ms.ToArray();
}
}
这是在使用最新的iTextSharp库5.5.10时完成的,测试是在w8Ben文件上完成的
以下是文件
第一
第二
合并