1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java itext html转PDF解决中文无法显示以及base64图片处理

java itext html转PDF解决中文无法显示以及base64图片处理

时间:2023-03-23 09:48:54

相关推荐

java itext html转PDF解决中文无法显示以及base64图片处理

文章目录

一、添加maven依赖二、处理中文不显示问题三、处理HTML文件中Base64格式图片不显示问题四、封装工具类

一、添加maven依赖

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

二、处理中文不显示问题

核心代码如下:

import com.itextpdf.text.Font;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.tool.xml.XMLWorkerFontProvider;import org.springframework.core.io.DefaultResourceLoader;import java.io.File;public class AsianFontProvider extends XMLWorkerFontProvider {@Overridepublic Font getFont(String fontname, String encoding, float size, final int style) {try {File file = new DefaultResourceLoader().getResource("").getFile();//字体文件绝对路径String path =file.toString()+File.separator+"templates"+File.separator+"simfang.ttf";BaseFont bfChinese =BaseFont.createFont( path , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);return new Font(bfChinese, size, style);} catch (Exception e) {}return super.getFont(fontname, encoding, size, style);}}

这里我使用的是仿宋字体,字体文件放在了项目的templates目录。

避坑:

开发阶段使用的是spring boot内置的tomcat,导出的PDF没有什么问题,发布到服务器后,发现导出的PDF中文字体还是没办法显示。经过调试发现,当使用中文字体的时候,下面这个方法的fontname变量是乱码。

public Font getFont(String fontname, String encoding, float size, final int style)

原因就是tomcat中文乱码导致的。在tomcat的bin目录catalina.batcatalina.sh添加如下配置,解决tomcat中文乱码问题

set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% -Dfile.encoding=UTF-8"

三、处理HTML文件中Base64格式图片不显示问题

import java.util.ArrayList;import java.util.List;import java.util.Map;import com.itextpdf.text.Chunk;import com.itextpdf.text.Element;import com.itextpdf.text.Image;import com.itextpdf.text.pdf.codec.Base64;import com.itextpdf.tool.xml.NoCustomContextException;import com.itextpdf.tool.xml.Tag;import com.itextpdf.tool.xml.WorkerContext;import com.itextpdf.tool.xml.exceptions.RuntimeWorkerException;import com.itextpdf.tool.xml.html.HTML;import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;public class ImageTagProcessor extends com.itextpdf.tool.xml.html.Image {@Overridepublic List<Element> end(final WorkerContext ctx, final Tag tag, final List<Element> currentContent) {final Map<String, String> attributes = tag.getAttributes();String src = attributes.get(HTML.Attribute.SRC);List<Element> elements = new ArrayList<Element>(1);if (null != src && src.length() > 0) {Image img = null;if (src.startsWith("data:image/")) {final String base64Data = src.substring(src.indexOf(",") + 1);try {img = Image.getInstance(Base64.decode(base64Data));} catch (Exception e) {throw new RuntimeException(e);}if (img != null) {try {final HtmlPipelineContext htmlPipelineContext = getHtmlPipelineContext(ctx);elements.add(getCssAppliers().apply(new Chunk((com.itextpdf.text.Image) getCssAppliers().apply(img, tag, htmlPipelineContext), 0, 0, true), tag,htmlPipelineContext));} catch (NoCustomContextException e) {throw new RuntimeWorkerException(e);}}}if (img == null) {elements = super.end(ctx, tag, currentContent);}}return elements;}}

四、封装工具类

import com.itextpdf.text.Document;import com.itextpdf.text.PageSize;import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.Pipeline;import com.itextpdf.tool.xml.XMLWorker;import com.itextpdf.tool.xml.XMLWorkerHelper;import com.itextpdf.tool.xml.css.CssFilesImpl;import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;import com.itextpdf.tool.xml.html.CssAppliersImpl;import com.itextpdf.tool.xml.html.HTML;import com.itextpdf.tool.xml.html.TagProcessorFactory;import com.itextpdf.tool.xml.html.Tags;import com.itextpdf.tool.xml.parser.XMLParser;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;import java.io.ByteArrayInputStream;import java.io.InputStream;import java.io.OutputStream;import java.nio.charset.Charset;public class PdfUtils {/*** HTML TO PDF 到指定目录* @param html html内容* @param os PDF文件生成目录*/public static void writeStringToOutputStreamAsPDF(String html, OutputStream os) {writeToOutputStreamAsPDF(new ByteArrayInputStream(html.getBytes()), os);}/*** HTML TO PDF 到指定目录* @param html html内容* @param os PDF文件生成目录*/public static void writeToOutputStreamAsPDF(InputStream html, OutputStream os) {try {Document document = new Document(PageSize.A4,36, 36, 36, 36);PdfWriter pdfWriter = PdfWriter.getInstance(document, os);document.open();//BASE64图片处理final TagProcessorFactory tagProcessorFactory = Tags.getHtmlTagProcessorFactory();tagProcessorFactory.removeProcessor(HTML.Tag.IMG);tagProcessorFactory.addProcessor(new ImageTagProcessor(), HTML.Tag.IMG);final CssFilesImpl cssFiles = new CssFilesImpl();cssFiles.add(XMLWorkerHelper.getInstance().getDefaultCSS());final StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver(cssFiles);final HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(new AsianFontProvider()));hpc.setAcceptUnknown(true).autoBookmark(true).setTagFactory(tagProcessorFactory);final HtmlPipeline htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, pdfWriter));final Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);final XMLWorker worker = new XMLWorker(pipeline, true);final Charset charset = Charset.forName("UTF-8");final XMLParser xmlParser = new XMLParser(true, worker, charset);xmlParser.parse(html,charset);document.close();} catch (Exception e) {}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。