文章目录

  • 一、添加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) {}}
}

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

  1. 【itext学习之路】--6.将html转成pdf(解决中文不显示)

    来源:[itext学习之路]-------(第七篇)将html转成pdf(解决中文不显示)_tomatocc的博客-CSDN博客 在上一篇文章中,我们学习了使用对pdf进行盖章/签章/数字签名,到此为 ...

  2. HTML生成PDF模板(Java iText+FreeMarker生成PDF(HTML转PDF))

    Java iText+FreeMarker生成PDF(HTML转PDF) 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等.方便用户查看,下载,打 ...

  3. java读取.properties文件及解决中文乱码问题

    java读取.properties文件及解决中文乱码问题 参考文章: (1)java读取.properties文件及解决中文乱码问题 (2)https://www.cnblogs.com/helloq ...

  4. vscode打开html中文乱码,Visual Studio Code 1.44 解决中文代码显示乱码问题(小白图文教程)...

    现今主流的计算机中文字符编码方案是:GBK和UTF-8. 不同编码方案使用不同的字符集,GBK字符集在中文字符长度和字符数量上存在绝对优势,但对国外字符并不支持.所以,完全面向国内的程序/网页使用的是 ...

  5. Itext生成pdf文件,itext+Freemarker生成pdf,(中文空白解决)

    来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...

  6. 在linux系统下java实现pdf导出汉字无法显示_ubuntu/Linux PDF文件中文无法显示或中文为方块的解决方法...

    ubuntu1004,pdf文件有的无法显示中文,解决办法如下: 1. 先安装字体 A.sudo apt-get install xpdf-chinese-simplified; B. sudo ap ...

  7. java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案

    本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...

  8. java txt中文乱码,JAVA读取TXT文件 可解决中文乱码问题

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...

  9. cocos2dx java 乱码_[cocos2d-x] --- 完美解决中文乱码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一 介绍 最近由于各种各样的原因,好长时间没有学习cocos2d-x了.突然有种害怕的感觉,这样下去,以前学的关于cocos2d-x的一点皮毛会彻底忘记的 ...

最新文章

  1. 单链表-删除重复节点(递增链表)
  2. mysql提取数据字符_如何从MySQL查询的字符串中提取数值?
  3. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第14章-带通信和输入时延的异构竞争多智能体系统分组一致性
  4. ML:根据不同机器学习模型输出的预测值+且与真实值相减得到绝对误差对比+误差可视化
  5. 树莓派 QT 编程下的硬件中断
  6. 数据3分钟丨CSDN 1024程序员节来啦!PostgreSQL 14和openGauss 2.1.0在同一天正式发布。...
  7. python线程同步
  8. 字符串处理 百度之星资格赛 1002 列变位法解密
  9. How to do Regularization?(如何正则化)(1)----吴恩达机器学习
  10. html实现小键盘,js之软键盘实现(源码) _javascript教程
  11. 微信公众号全局返回码
  12. idea类注释模板快捷键设置
  13. 电脑网络经常掉线怎么办
  14. 【电商运营】试试这5种个性化营销方法,告别无效营销!
  15. k6性能测试工具,并生成可视化报告
  16. 推动计算机革命的幕后黑手
  17. 数据仓库:分层设计详解
  18. 论文《基于结构光和双目视觉的三维重建系统研究》摘要
  19. Linux ffmpeg 一键安装
  20. ibook备份_在“提示”框中:选择多个壁纸,iBook快速导航和跟踪应用价格

热门文章

  1. 编译原理 C语言词法分析程序的设计与实现
  2. 吴恩达的机器学习 上下角标问题
  3. 2022年软件行业就业分析及如何准备面试应聘
  4. 基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)
  5. 单菌二三代数据组装神器-Unicycler
  6. EDIUS是怎么制作倒影
  7. 非线性结构数据及遍历算法详解
  8. 如何利用开源风控系统(星云)防止撞库?
  9. 推荐一篇北师大本科生的论文:高并发高流量网站架构
  10. 华为程控交换机 CC08 华为数字程控交换机