【问题标题】:Convert PDF to PDF/A3 or PDF/A-1 to PDF/A-3将 PDF 转换为 PDF/A3 或 PDF/A-1 转换为 PDF/A-3
【发布时间】:2016-03-17 01:52:44
【问题描述】:

我正在测试 iTextSharp 以生成 ZUGFeRD 文件。我的第一步是从现有的 PDF/A-3 文件生成 ZUGFeRD 符合文件。这是通过使用 PDFACopy 并创建必要的 PDFFileSpecification 成功完成的。

下一步是从现有的 PDF 或 PDF/A-1 文件生成 PDF/A-3 文件,这是最难的部分。

首先,当我尝试将 PDFACopy 与常规 PDF(不是 PDF/A)结合使用时,我收到一个错误,即 PDFACopy 只能用于符合 PDF/A 的文件。 我的第一个问题是,如何使用 iTextSharp 从 PDF 中获取符合 PDF/A-3 的文件?

为了缩小差距,我决定使用 ghostscript 将 PDF 转换为 PDF/A-1 文件(参见How to use ghostscript to convert PDF to PDF/A or PDF/X?)。 这很成功,我又试了一次。然后是错误“不同的 PDF/A 版本”。被抛出。看来我无法从现有的 PDF/A-1 复制到新的 PDF/A-3。 如何从现有 PDF(/A-1) 创建此 PDF/A-3?这可能吗?

这是我的代码:

XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(XML);
        byte[] xmlBytes = Encoding.Default.GetBytes(xmlDoc.OuterXml);

        Document doc = new Document();
        PdfReader src_reader = new PdfReader(pdfPath);    

        FileStream fs = new FileStream(DEST, FileMode.Create, FileAccess.ReadWrite);

        PdfACopy aCopy = new PdfACopy(doc, fs, PdfAConformanceLevel.ZUGFeRD);

        doc.AddLanguage("de-DE");
        doc.AddTitle("title");
        doc.SetPageSize(src_reader.GetPageSizeWithRotation(1));

        aCopy.SetTagged();
        aCopy.UserProperties = true;
        aCopy.PdfVersion = PdfCopy.VERSION_1_7;
        aCopy.ViewerPreferences = PdfCopy.DisplayDocTitle;
        aCopy.CreateXmpMetadata();
        aCopy.XmpWriter.SetProperty(PdfAXmpWriter.zugferdSchemaNS, PdfAXmpWriter.zugferdDocumentFileName, "ZUGFeRD-invoice.xml");

        //Ab hier können keine Metadaten mehr geschrieben werden
        doc.Open();

        ICC_Profile icc = ICC_Profile.GetInstance(new FileStream(ICM, FileMode.Open));
        aCopy.SetOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc);

        [...add the dictionary to doc..]
        aCopy.AddDocument(src_reader);
        doc.Close();

还有一个问题: addDocument 有效,但是当我使用 copy.addPage(copy.getImportedPage(src_reader, i)) 时,会抛出错误“文档没有页面”。 为什么?

【问题讨论】:

    标签: c# pdf itext pdfa zugferd


    【解决方案1】:

    1.可以将普通 PDF 转换为 PDF/A 文档吗?

    答案是:视情况而定。

    PDF/A 是 PDF 的子集,涉及一些义务(例如,必须嵌入所有字体)和限制(例如,不允许使用 Javascript)。由于多种原因,iText 无法“自动”将常规 PDF 转换为 PDF/A。例如:如果没有嵌入字体,iText 不知道用哪种字体替换未嵌入的字体,也不知道在哪里可以找到所需的字体程序。通常这需要人工交互,因为用任意其他字体替换一种字体通常会导致 PDF 非常难看。

    答案是:视情况而定,因为有些人使用 iText 将 PDF 转换为 PDF/A,但这涉及大量编程和人为决策。我看到您在使用 GhostScript 时成功了。在这种情况下,GhostScript 会代替您做出一些决定。这可以导致可接受的结果。在某些情况下,结果将是不可接受的(例如,如果字体不匹配,PDF 看起来很奇怪)。

    2。您可以将 PDF/A-1 文件转换为 PDF/A-3 文件吗?

    PDF/A 标准的编写方式使旧版本的 PDF/A 规范永远不会过时。较新的版本只会添加较新的功能。例如:PDF/A-1 基于 PDF 1.4 规范。 PDF 1.5 中引入了可选内容功能 (OCG)。引入OCG是PDF/A-2和PDF/A-1的区别之一。

    这意味着符合 PDF/A-1 的每个文件都会自动符合 PDF/A-2。但是,PDF/A-2 文件可能包含 PDF/A-1 不支持的功能。

    3. PDF/A-2 和 PDF/A-3 有什么区别?

    PDF/A-2 和 PDF/A-3 相同,但有一个区别:PDF/A-3 文件可以包含不是 PDF/A 文件的附件。例如:PDF/A-3 文件可以有一个 Word 文件作为附件、一个 XLS 文件、一个纯文本文件,......您提到 ZUGFeRD:在这种情况下,PDF/A-3 文件至少有一个 XML文件作为附件。

    总结:

    这是对一个广泛问题的广泛回答(您的问题涉及许多不同的方向,因此很难给您一个具体的答案)。为什么不使用已经内置的 ZUGFeRD 支持来创建发票?阅读ZUGFeRD, the future of invoicing了解更多信息。

    【讨论】:

    • 感谢您的快速响应!我有始终具有相同字体的 .pdf 文件。那么将其转换为PDF / A应该没有问题吗? 如果 PDF 包含字体,它会自动成为 PDF/A?不是吗?您如何对此进行编程?我不能使用 PDFCopy 从 PDF 到 PDF/A 文件?目前我将在没有 C# 的情况下创建 my.xml 文件。所以我的任务是将创建的 .XML 文件附加到常规 PDF 中。正如你所提到的,我需要 PDF/A-3。所以我需要转换这个普通的PDF。内置解决方案创建了一个我不需要的全新 PDF 布局。 问题是获取PDF/A3
    • 我想用 iText 提供一体化解决方案,这样就不需要 ghostscript。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2020-03-07
    相关资源
    最近更新 更多