我正在使用itextsharp从模板pdf文件创建pdf。但是新的pdf文件就像动态pdf一样被创建。我想将此文件转换为静态pdf文件,因此我尝试使用 xfaworker 。我从itextsharp.licensekey.dll中收到“Signature was corrupted”错误。我如何使用xfaworker或其他dll来展平动态pdf?
public string Create(FaxPDFModel model, MemoryStream ms)
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string templatePath = Path.GetDirectoryName(Uri.UnescapeDataString(uri.Path));
PdfReader pdfTemplate = new PdfReader(Path.Combine(Path.Combine(templatePath, "Docs"), "fax_template.pdf"));
PdfStamper stamper = new PdfStamper(pdfTemplate, ms);
stamper.Writer.CloseStream = false;
BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, "ISO-8859-9", BaseFont.EMBEDDED);
var acroFields = stamper.AcroFields;
acroFields.GenerateAppearances = true;
stamper.FormFlattening = true;
acroFields.AddSubstitutionFont(bf);
acroFields.SetField("Name", "Mutabakat test");
acroFields.SetField("Title", "DANIŞMANLIK");
acroFields.SetField("Department", "test");
acroFields.SetField("Phone", "0 (212) 555 55 55");
stamper.Close();
string path = Path.Combine(Path.Combine(templatePath, "Docs"), System.Guid.NewGuid().ToString());
string pdfPath = path + ".pdf";
Document document = new Document();
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath, FileMode.Create));
XFAFlattener xfaf = new XFAFlattener(document, writer);
ms.Position = 0;
xfaf.Flatten(new PdfReader(ms));
document.Close();
return pdfPath;
}
答案 0 :(得分:1)
如果您想解决问题,首先必须修复以下错误:
<强> 1。您正在使用代码填写AcroForms而不是代码来填充XFA表单:
如果您有动态XFA表单,则PDF将充当XML的容器。此表单不期望以键值对的形式存在数据。此表单要求将数据存储为XML。
您无法使用此代码:
var acroFields = stamper.AcroFields;
acroFields.AddSubstitutionFont(bf);
acroFields.SetField("Name", "Mutabakat test");
acroFields.SetField("Title", "DANIŞMANLIK");
acroFields.SetField("Department", "test");
acroFields.SetField("Phone", "0 (212) 555 55 55");
此代码期望您的表单是AcroForm。你需要填写这样的表格:
AcroFields form = stamper.AcroFields;
XfaForm xfa = form.Xfa;
xfa.FillXfaForm(new FileStream(xml, FileMode.Open));
在此代码段xml
中指的是存储为XML的数据。
<强> 2。您在展平表单之前尝试展平表单:
我在代码的第一部分看到了这一行:
stamper.FormFlattening = true;
使用此行,您可以从PDF中删除所有交互性。关闭stamper
对象后,您将不再拥有表单,因此代码的第二部分将永远不会有效。
第3。您正在尝试嵌入标准类型1字体:
这条线没有意义:
BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, "ISO-8859-9", BaseFont.EMBEDDED);
Times-Roman是标准的Type 1字体(在过去,我们称之为Base14字体); iText永远不会嵌入为PDF定义的14种标准Type 1字体中的任何一种,因此参数BaseFont.EMBEDDED
将被忽略。
<强> 4。真正的错误:
XFA Worker是iTextSharp的封闭源插件。它需要有效的许可证密钥。当您收到错误"Signature was corrupted"
时,您使用的是损坏的许可证密钥。
可能的原因: