使用iTextSharp展平动态pdf

时间:2015-10-30 07:39:26

标签: c# pdf pdf-generation itextsharp xfa

我正在使用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;
}

1 个答案:

答案 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"时,您使用的是损坏的许可证密钥。

可能的原因:

  • 您不是iText Group的客户。您使用的是您在某处找到的密钥,并且您更改了其中的一些内容。
  • 您是iText Group的客户。你收到了钥匙,但不知怎的,它被篡改了。在过去,我们遇到过类似的问题,即客户正在阅读密钥,就好像它是在EBCDIC中编码一样。有关详细信息,请与iText Group的客户经理联系。