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.bat
或catalina.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) {}}
}
java itext html转PDF解决中文无法显示以及base64图片处理相关推荐
- 【itext学习之路】--6.将html转成pdf(解决中文不显示)
来源:[itext学习之路]-------(第七篇)将html转成pdf(解决中文不显示)_tomatocc的博客-CSDN博客 在上一篇文章中,我们学习了使用对pdf进行盖章/签章/数字签名,到此为 ...
- HTML生成PDF模板(Java iText+FreeMarker生成PDF(HTML转PDF))
Java iText+FreeMarker生成PDF(HTML转PDF) 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等.方便用户查看,下载,打 ...
- java读取.properties文件及解决中文乱码问题
java读取.properties文件及解决中文乱码问题 参考文章: (1)java读取.properties文件及解决中文乱码问题 (2)https://www.cnblogs.com/helloq ...
- vscode打开html中文乱码,Visual Studio Code 1.44 解决中文代码显示乱码问题(小白图文教程)...
现今主流的计算机中文字符编码方案是:GBK和UTF-8. 不同编码方案使用不同的字符集,GBK字符集在中文字符长度和字符数量上存在绝对优势,但对国外字符并不支持.所以,完全面向国内的程序/网页使用的是 ...
- Itext生成pdf文件,itext+Freemarker生成pdf,(中文空白解决)
来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...
- 在linux系统下java实现pdf导出汉字无法显示_ubuntu/Linux PDF文件中文无法显示或中文为方块的解决方法...
ubuntu1004,pdf文件有的无法显示中文,解决办法如下: 1. 先安装字体 A.sudo apt-get install xpdf-chinese-simplified; B. sudo ap ...
- java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案
本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...
- java txt中文乱码,JAVA读取TXT文件 可解决中文乱码问题
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...
- cocos2dx java 乱码_[cocos2d-x] --- 完美解决中文乱码
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一 介绍 最近由于各种各样的原因,好长时间没有学习cocos2d-x了.突然有种害怕的感觉,这样下去,以前学的关于cocos2d-x的一点皮毛会彻底忘记的 ...
最新文章
- 单链表-删除重复节点(递增链表)
- mysql提取数据字符_如何从MySQL查询的字符串中提取数值?
- 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第14章-带通信和输入时延的异构竞争多智能体系统分组一致性
- ML:根据不同机器学习模型输出的预测值+且与真实值相减得到绝对误差对比+误差可视化
- 树莓派 QT 编程下的硬件中断
- 数据3分钟丨CSDN 1024程序员节来啦!PostgreSQL 14和openGauss 2.1.0在同一天正式发布。...
- python线程同步
- 字符串处理 百度之星资格赛 1002 列变位法解密
- How to do Regularization?(如何正则化)(1)----吴恩达机器学习
- html实现小键盘,js之软键盘实现(源码) _javascript教程
- 微信公众号全局返回码
- idea类注释模板快捷键设置
- 电脑网络经常掉线怎么办
- 【电商运营】试试这5种个性化营销方法,告别无效营销!
- k6性能测试工具,并生成可视化报告
- 推动计算机革命的幕后黑手
- 数据仓库:分层设计详解
- 论文《基于结构光和双目视觉的三维重建系统研究》摘要
- Linux ffmpeg 一键安装
- ibook备份_在“提示”框中:选择多个壁纸,iBook快速导航和跟踪应用价格