我正在测试iTextSharp以生成ZUGFeRD文件。我的第一步是从现有的PDF / A-3文件生成ZUGFeRD一致性文件。这是成功的,使用PDFACopy并创建必要的PDFFileSpecification。
下一步是从现有PDF或PDF / A-1文件生成PDF / A-3文件,这是困难的部分。
首先,当我尝试将PDFACopy与常规PDF(非PDF / A)结合使用时,我会收到一条错误,即PDFACopy只能用于PDF / A-conform文件。 我的第一个问题是,如何使用iTextSharp从PDF获取PDF / A-3标准文件?
为了缩小差距,我决定将PDF转换为带有ghostscript的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))时,将抛出错误“文档没有页面”。的 WHY吗
答案 0 :(得分:4)
<强> 1。您可以将常规PDF转换为PDF / A文档吗?
答案是:取决于。
PDF / A是PDF的一个子集,涉及一些义务(例如,必须嵌入所有字体)和限制(例如,不允许使用Javascript)。 iText可以自动&#34;#34;出于多种原因将常规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了解详情。