4

我正在测试 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 文件(参见如何使用 ghostscript 将 PDF 转换为 PDF/A 或 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)) 时,会抛出错误“文档没有页面”。为什么?

4

1 回答 1

7

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,发票的未来以获取更多信息。

于 2015-12-11T08:40:50.370 回答