是否可以使用iText 7压平XFA PDF?我只看到有关它的Java文档(http://developers.itextpdf.com/content/itext-7-examples/itext-7-form-examples/flatten-xfa-using-pdfxfa)。
看起来您可以使用iTextSharp来执行此操作。
我认为它不是AcroForm PDF,因为做类似于这个答案的How to flatten pdf with Itext in c#?只是创建了一个无法正常打开的PDF。
答案 0 :(得分:2)
看起来你必须使用iTextSharp而不是iText7。看看NuGet版本,它看起来像iTextSharp本质上是iText5 .NET版本,就像上面评论中提到的Bruno一样,XFA的东西根本没有被移植到iText7 for .NET。
混淆源于在NuGet中同时拥有iText7和iTextSharp版本,而且试用页面也没有说明XFA工作者不能用于iText7的.NET版本(还有?)
我做了以下工作来完成我至少需要试用的东西:
打开项目管理器控制台并输入以下内容并按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上留下巨大的水印,但至少你可以让它工作,看看完整的许可证应该如何运作。
答案 1 :(得分:1)
对于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());