【发布时间】:2015-09-14 14:56:57
【问题描述】:
我在 asp.net (C#) 中使用 iTextSharp 以合并多个 PDf 模板。有一个打印功能,它只打印模板的数据。合并模板时,模板中可用的字段/控件使用 iTextSharp 的 RenameField 方法重命名。 此实现破坏了打印功能。由于已根据字段编写了打印功能。 对于合并模板,我使用的是 PDFCopy。
Document document = new Document();
bool flag = true;
using (FileStream fileStream = File.Create(newFile))
{
PdfSmartCopy copy = new PdfSmartCopy(document, fileStream);
PdfReader reader;
MemoryStream baos;
for (int i = 0; i < loopCount; i++)
{
reader = new PdfReader(pdfTemplate);
baos = new MemoryStream();
stamper = new PdfStamper(reader, baos);
AcroFields pdfDoc = stamper.AcroFields;
BuildData(datarow,pdfDoc, obj)
renameFields(reader);
stamper.FormFlattening = false;
stamper.Close();
reader = new PdfReader(baos.ToArray());
copy.AddPage(copy.GetImportedPage(reader, 1));
}
document.Close();
strFileName = newFile;
}
private static void renameFields(PdfReader pdfReader)
{
string prepend = String.Format("_{0}", counter++);
foreach (KeyValuePair<string, AcroFields.Item> de in pdfReader.AcroFields.Fields)
{
pdfReader.AcroFields.RenameField(de.Key.ToString(), prepend + de.Key.ToString());
}
}
Edit1:这是我在 itextsharp 文档中找到的解决方案,但它不起作用 “使用 PdfCopy 处理文档 已命名的目的地是这些例外之一。所有注释,例如 作为链接注释,与 PdfCopy 一起保存,但它们不再适用于本地链接 命名的目的地。这个问题有一个解决方法。”
PdfReader[] readers = {
new PdfReader(LinkActions.RESULT2),
new PdfReader(LinkActions.RESULT1) };
Document document = new Document();
PdfCopy copy =
new PdfCopy(document, new FileOutputStream(RESULT1));
document.open();
int n;
for (int i = 0; i < readers.length; i++) {
readers[i].consolidateNamedDestinations();
n = readers[i].getNumberOfPages();
for (int page = 0; page < n; ) {
copy.addPage(copy.getImportedPage(readers[i], ++page));
}
}
【问题讨论】:
-
您在合并两个 pdf 文档时遇到问题吗?
-
根据您的描述,您的模板有一些特别之处。它们的特殊打印功能似乎与重命名的 AcroForm 字段不符。不幸的是,如果您想合并多个模板,则需要重命名它们。因此,您还必须使打印功能适应重命名的字段。如果您想合并。
-
@thewisegod 不,我没有合并问题,合并后模板顶部的操作按钮不起作用。
-
为了合并 pdf,我使用了 PdfCopy 和 renameFields 功能,之后我的链接按钮不起作用。
标签: c# pdf itextsharp