Использование C# iText 7 для выравнивания 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 с Itext в C#? просто создал PDF-файл, который не открывается должным образом.

2 ответа

Решение

Похоже, вы должны использовать iTextSharp, а не iText7. Глядя на версию NuGet, похоже, что iTextSharp - это, по сути, версия iText5 .NET, и, как упоминал Бруно в комментариях выше, материал XFA просто не был перенесен в iText7 для.NET.

Путаница возникла из-за наличия в NuGet версий iText7 и iTextSharp, а также пробной страницы, в которой не указывалось, что работник XFA не был доступен для.NET-версии iText7 (пока?)

Я сделал следующее, чтобы выполнить то, что мне было нужно, по крайней мере, для испытания:

  1. Запросите пробную копию здесь: http://demo.itextsupport.com/newslicense/
  2. Вам отправят по электронной почте лицензионный ключ xml, вы можете просто разместить его на своем рабочем столе.
  3. Создайте новое консольное приложение в Visual Studio
  4. Откройте консоль диспетчера проектов, введите следующую команду и нажмите клавишу ВВОД (это также установит другие зависимости)

    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());
Другие вопросы по тегам