当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将PDF转换为PDF/A3或PDF/A-1转换为PDF/A-3》经验,为你挑选了1个好方法。

我正在测试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-conform文件?

为了缩小差距,我决定使用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> Bruno Lowagi..:

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,开发票的未来,了解更多信息。

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有