use*_*130 2 c# itext itextsharp
我现在试过这个,但它不起作用.form.GenerateAppearances = true;我合并了我的2个文件然后保存.然后我再次打开它以填充所有字段.它说所有的Acrofields钥匙都不见了,但是当我在Nitro pro中打开它的时候.为什么我不能在代码中看到它们?在保存之前我是否必须添加一些东西?
private static void CombineAndSavePdf1(string savePath, List<string> lstPdfFiles)
{
using (Stream outputPdfStream = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
Document document = new Document();
PdfSmartCopy copy = new PdfSmartCopy(document, outputPdfStream);
document.Open();
PdfReader reader;
int totalPageCnt;
PdfStamper stamper;
string[] fieldNames;
foreach (string file in lstPdfFiles)
{
reader = new PdfReader(file);
totalPageCnt = reader.NumberOfPages;
for (int pageCnt = 0; pageCnt < totalPageCnt; )
{
//have to create new reader for each page or PdfStamper will throw error
reader = new PdfReader(file);
stamper = new PdfStamper(reader, outputPdfStream);
fieldNames = new string[stamper.AcroFields.Fields.Keys.Count];
stamper.AcroFields.Fields.Keys.CopyTo(fieldNames, 0);
foreach (string name in fieldNames)
{
stamper.AcroFields.RenameField(name, name);
}
copy.AddPage(copy.GetImportedPage(reader, ++pageCnt));
}
copy.FreeReader(reader);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您正在以错误的方式合并文档.请参阅MergeForms了解如何正确执行此操作.代码中缺少的关键字是:
copy.setMergeFields();
Run Code Online (Sandbox Code Playgroud)
如果没有它,这些字段就会消失(正如你所注意到的).
还有一个MergeForms2例子解释了如何合并两个相同的形式.在这种情况下,您需要重命名字段,因为每个字段都需要具有唯一的名称.我正在添加对第二个示例的引用,因为我看到您也尝试重命名字段.但是,您的代码存在严重缺陷:您创建了一个stamper对象,但您从未这样做过stamper.close().您对该reader对象的使用也存在问题.总而言之,最好丢弃你的代码,并使用官方iText网站上的两个例子重新开始.
更新:我已经将标签itext和itextsharp添加到您的问题中.只有这时我注意到你使用的是iTextSharp而不是iText.对于C#开发人员来说,将Java代码移植到C#应该很容易,但我从未编写过C#程序,因此请使用JAVA示例,就像使用伪代码一样.C#中的代码不会那么不同.
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
Document document = new Document();
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));
copy.setMergeFields();
document.open();
List<PdfReader> readers = new ArrayList<PdfReader>();
for (int i = 0; i < 3; ) {
PdfReader reader = new PdfReader(renameFields(src, ++i));
readers.add(reader);
copy.addDocument(reader);
}
document.close();
for (PdfReader reader : readers) {
reader.close();
}
}
public byte[] renameFields(String src, int i) throws IOException, DocumentException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, baos);
AcroFields form = stamper.getAcroFields();
Set<String> keys = new HashSet<String>(form.getFields().keySet());
for (String key : keys) {
form.renameField(key, String.format("%s_%d", key, i));
}
stamper.close();
reader.close();
return baos.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)