将PDF转换为PDF/A3或将PDF/A-1转换为PDF/A-3

5

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

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

首先,当我尝试在常规PDF(而不是PDF / A)中使用PDFACopy时,会出现错误,指出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))时,会抛出“文档没有页面”的错误。 为什么?

1个回答

8

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规范。可选内容功能(OCG)是在PDF 1.5中引入的。OCG的引入是PDF/A-2和PDF/A-1之间的区别之一。
这意味着符合PDF/A-1标准的每个文件自动符合PDF/A-2标准。但是,PDF/A-2文件可能包含不支持PDF/A-1的功能。
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了,是吗?您如何编写程序来实现这一点?我不能使用从PDF复制到PDF/A文件的PDFCopy?目前,我将创建我的.xml文件而不使用C#。因此,我的任务是将创建的.XML文件附加到常规PDF上。正如您所提到的,我需要PDF/A-3来完成此操作。因此,我需要将此常规PDF转换为PDF/A-3。内置解决方案会创建一个我不需要的全新PDF布局。问题在于如何获取PDF/A3。 - AndreasGloeckner
我希望使用iText拥有一个全能解决方案,这样就不需要使用ghostscript。 - AndreasGloeckner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接