如何使用iText和XMLWorker生成有效的PDFA文件(HTML到PDFA流程)

如何使用iText和XMLWorker生成有效的PDFA文件(HTML到PDFA流程),第1张

概述我目前正在开发一种方法,它将接受 HTML输入并将其转换为有效的PDF / A文件.我知道如何使用iText以编程方式构建有效的PDF / A文件(参考: http://itextsupport.com/download/pdfa3.html),但我无法使用HTML作为输入生成有效的PDF / A文件,并使用XMLWorker将此输入转换为PDF文件.我现在遇到的问题是由于PDF / A格式的嵌入 我目前正在开发一种方法,它将接受 HTML输入并将其转换为有效的pdf / A文件.我知道如何使用iText以编程方式构建有效的pdf / A文件(参考: http://itextsupport.com/download/pdfa3.html),但我无法使用HTML作为输入生成有效的pdf / A文件,并使用XMLWorker将此输入转换为pdf文件.我现在遇到的问题是由于pdf / A格式的嵌入字体要求.我总是得到这个例外:

线程“main”中的异常com.itextpdf.text.pdf.pdfAConformanceException:必须嵌入所有字体.这个不是:Helvetica

我尝试通过CSS文件强制HTML输入使用哪些字体,并通过XMLWorkerFontProvIDer类在输出pdf文件中注册我想要使用的字体,但似乎我做错了,因为上面评论的异常总是抛出.

为了使XMLWorker使用通过XMLWorkerFontProvIDer类注册的字体,还需要什么?我想避免在输入中存在的每个HTML元素中使用默认字体Helvetica.

下面是我用于测试的代码:

style.CSS(只有1行):

* { Font: normal 100% Arial,sans-serif !important; }

Main.java:

package com.itextpdf;import java.io.file;import java.io.fileinputStream;import java.io.fileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.Reader;import java.io.StringReader;import com.itextpdf.text.document;import com.itextpdf.text.pdf.ICC_Profile;import com.itextpdf.text.pdf.pdfAConformanceLevel;import com.itextpdf.text.pdf.pdfAWriter;import com.itextpdf.tool.xml.XMLWorker;import com.itextpdf.tool.xml.XMLWorkerFontProvIDer;import com.itextpdf.tool.xml.XMLWorkerHelper;import com.itextpdf.tool.xml.CSS.CSSfile;import com.itextpdf.tool.xml.CSS.StyleAttrCSSResolver;import com.itextpdf.tool.xml.HTML.CSSApplIErs;import com.itextpdf.tool.xml.HTML.CSSApplIErsImpl;import com.itextpdf.tool.xml.HTML.Tags;import com.itextpdf.tool.xml.parser.XMLParser;import com.itextpdf.tool.xml.pipeline.CSS.CSSResolver;import com.itextpdf.tool.xml.pipeline.CSS.CSSResolverPipeline;import com.itextpdf.tool.xml.pipeline.end.pdfWriterPipeline;import com.itextpdf.tool.xml.pipeline.HTML.HTMLPipeline;import com.itextpdf.tool.xml.pipeline.HTML.HTMLPipelineContext;public class Main {    /**     * @param args     */    public static voID main(String[] args) {        StringBuffer buf = new StringBuffer();        buf.append("<!DOCTYPE HTML>");        buf.append("<HTML>");        buf.append("<head>");        buf.append("<Title>Test</Title>");        buf.append("</head>");        buf.append("<body>");        buf.append("<p>This is a test</p>");        buf.append("</body>");        buf.append("</HTML>");        OutputStream file = null;        document document = null;        pdfAWriter writer = null;        try {            file = new fileOutputStream(new file("C:\Users\amartin\Desktop\Test.pdf"));            document = new document();            writer = pdfAWriter.getInstance(document,file,pdfAConformanceLevel.pdf_A_1B);            // Create XMP Metadata. It's a pdf/A requirement.            writer.createXmpMetadata();            document.open();            // Set output intent. pdf/A requirement.            ICC_Profile icc = ICC_Profile.getInstance(new fileinputStream("./src/main/resources/com/itextpdf/sRGB color Space Profile.icm"));            writer.setoutputIntents("Custom","","http://www.color.org","sRGB IEC61966-2.1",icc);            // CSS            CSSResolver CSSResolver = new StyleAttrCSSResolver();            CSSfile CSSfile = XMLWorkerHelper.getCSS(new fileinputStream("./CSS/style.CSS"));            CSSResolver.addCSS(CSSfile);            XMLWorkerFontProvIDer FontProvIDer = new XMLWorkerFontProvIDer();            FontProvIDer.register("./Fonts/arial.ttf");            FontProvIDer.register("./Fonts/sans-serif.ttf");            FontProvIDer.addFontSubstitute("lowagIE","garamond");            CSSApplIErs CSSApplIErs = new CSSApplIErsImpl(FontProvIDer);            HTMLPipelineContext HTMLContext = new HTMLPipelineContext(CSSApplIErs);            HTMLContext.setTagFactory(Tags.getHTMLTagProcessorFactory());            // Pipelines            pdfWriterPipeline pdf = new pdfWriterPipeline(document,writer);            HTMLPipeline HTML = new HTMLPipeline(HTMLContext,pdf);            CSSResolverPipeline CSS = new CSSResolverPipeline(CSSResolver,HTML);            XMLWorker worker = new XMLWorker(CSS,true);            XMLParser p = new XMLParser(worker);            Reader reader = new StringReader(buf.toString());            p.parse(reader);        } catch (Exception e) {            e.printstacktrace();        } finally {            if (document != null && document.isopen())                document.close();            try {                if (file != null)                    file.close();            } catch (IOException e) {}            if (writer != null && !writer.isCloseStream())                writer.close();        }    }}

编辑:

回答Bruno,我扩展了FontFactoryImp类,重写了getFont()方法(包含所有参数的方法).它调用System.out.println函数,如下所示:

System.out.println("=Fontname: " + Fontname + " =enCoding: " + enCoding + " =embedded : " + embedded + " =size: " + size + " =style: " + style + " =Basecolor: " + color)

然后使用相同的参数调用parent.getFont()方法.我看到的唯一输出是:

=Fontname: null =enCoding: Cp1252 =embedded : true =size: -1.0 =style: -1 =Basecolor: null
=Fontname: null =enCoding: Cp1252 =embedded : true =size: -1.0 =style: -1 =Basecolor: null

并抛出异常,粘贴在此代码之前.

解决方法 根据您发送到System.out的反馈,似乎XML Worker不会选择您要使用的字体系列.

请指定如下字体系列:

Font-family: "Arial"

在CSS中使用’Font’可能有用,但它很棘手.我认为iText看起来很正常并将其解释为使用默认字体.

总结

以上是内存溢出为你收集整理的如何使用iText和XMLWorker生成有效的PDF / A文件(HTML到PDF / A流程)全部内容,希望文章能够帮你解决如何使用iText和XMLWorker生成有效的PDF / A文件(HTML到PDF / A流程)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1074622.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存