使用 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(还没有?)
我做了以下工作来完成我至少需要的试用:
-
您将通过电子邮件收到 xml 许可证密钥,您可以暂时将其放在桌面上。
在 Visual Studio
中创建一个新的控制台应用程序
打开项目管理器控制台并输入以下内容并按 ENTER(这也会安装其他依赖项)
Install-Package itextsharp.xfaworker
使用以下代码:
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());
是否可以使用 iText 7 拼合 XFA PDF?我只看到了关于它的 Java 文档 (http://developers.itextpdf.com/content/itext-7-examples/itext-7-form-examples/flatten-xfa-using-pdfxfa)。
您似乎可以使用 iTextSharp,但是要这样做。
我认为它不是 AcroForm PDF,因为执行类似于此答案的操作
看来您必须使用 iTextSharp 而不是 iText7。查看 NuGet 版本,看起来 iTextSharp 本质上是 iText5 .NET 版本,就像上面评论中提到的 Bruno 一样,XFA 内容根本没有移植到 iText7 for .NET。
混淆源于在 NuGet 中同时拥有 iText7 和 iTextSharp 版本,而且试用页面没有说明 XFA worker 不适用于 .NET 版本的 iText7(还没有?)
我做了以下工作来完成我至少需要的试用:
您将通过电子邮件收到 xml 许可证密钥,您可以暂时将其放在桌面上。
在 Visual Studio
中创建一个新的控制台应用程序打开项目管理器控制台并输入以下内容并按 ENTER(这也会安装其他依赖项)
Install-Package itextsharp.xfaworker
使用以下代码:
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());