使用 C# iText 7 拼合 XFA PDF

Using C# iText 7 to flatten an XFA PDF

是否可以使用 iText 7 拼合 XFA PDF?我只看到了关于它的 Java 文档 (http://developers.itextpdf.com/content/itext-7-examples/itext-7-form-examples/flatten-xfa-using-pdfxfa)。

您似乎可以使用 iTextSharp,但是要这样做。

我认为它不是 AcroForm PDF,因为执行类似于此答案的操作 只是创建了一个无法正常打开的 PDF。

看来您必须使用 iTextSharp 而不是 iText7。查看 NuGet 版本,看起来 iTextSharp 本质上是 iText5 .NET 版本,就像上面评论中提到的 Bruno 一样,XFA 内容根本没有移植到 iText7 for .NET。

混淆源于在 NuGet 中同时拥有 iText7 和 iTextSharp 版本,而且试用页面没有说明 XFA worker 不适用于 .NET 版本的 iText7(还没有?)

我做了以下工作来完成我至少需要的试用:

  1. 在此处索取试用版:http://demo.itextsupport.com/newslicense/

  2. 您将通过电子邮件收到 xml 许可证密钥,您可以暂时将其放在桌面上。

  3. 在 Visual Studio

    中创建一个新的控制台应用程序
  4. 打开项目管理器控制台并输入以下内容并按 ENTER(这也会安装其他依赖项)

    Install-Package itextsharp.xfaworker
    
  5. 使用以下代码:

static void Main(string[] args)
{
    ValidateLicense();
    var sourcePdfPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "<your_xfa_pdf_file>");
    var destinationPdfPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "output.pdf");
    FlattenPDF(sourcePdfPath, destinationPdfPath);
}

private static void ValidateLicense()
{
    var licenseFileLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "itextkey.xml");
    iTextSharp.license.LicenseKey.LoadLicenseFile(licenseFileLocation);
}

private static void FlattenPDF(string sourcePdfPath, string destinationPdfPath)
{
    using (var sourcePdfStream = File.OpenRead(sourcePdfPath))
    {
        var document = new iTextSharp.text.Document();
        var writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, new FileStream(destinationPdfPath, FileMode.Create));
        var xfaf = new iTextSharp.tool.xml.xtra.xfa.XFAFlattener(document, writer);
        sourcePdfStream.Position = 0;
        xfaf.Flatten(new iTextSharp.text.pdf.PdfReader(sourcePdfStream));
        document.Close();
    }
}

试用版会在生成的 PDF 上加一个巨大的水印,但至少你可以让它工作,看看完整许可证应该如何工作。

对于 IText 7,这可以通过以下方式完成

LicenseKey.LoadLicenseFile(@"Path of the license file");
MemoryStream dest_File = new MemoryStream();
XFAFlattener xfaFlattener = new XFAFlattener();
xfaFlattener.Flatten(new MemoryStream( File.ReadAllBytes(@"C:\Unflattened file")), dest_File);
File.WriteAllBytes("flatten.pdf", dest_File.ToArray());