线程“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流程)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)