iText是一个文件转换的jar包,可实现html文件,xml文件转PDF,word的jar包。

maven依赖:

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version>
</dependency>

<dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.9</version>
</dependency>

使用首先要到的一个大问题就是不能处理中文,之前用网上教的字体是一直报这个错,com.itextpdf.text.DocumentException: Font "STSongStd-Light" with "UniGB-UCS2-H" is not recognized。
在网上痛苦的找了很久,大家给的最多的答案就是去改jar的引用路径,这方法太不靠谱了,jar一直在升级,你总不能每次都去改吧,最后终于找到了解决办法,问题根源就是这个工具没有在jar包中打包中文字体,不过它给我们提供了一个字体设置工厂,上代码,
public class PDFUtil {private static final Logger logger = LoggerFactory.getLogger(PDFUtil.class);
    private static String fontPath = "/Users/feixiaobo/Downloads/simsun.ttf";
    public static InputStream htmlToPDF(InputStream htmlInputStream) {ByteArrayOutputStream out = null;ByteArrayInputStream inputStream = null;Document document = new Document();XMLWorkerFontProvider provider = new XMLWorkerFontProvider();provider.register(fontPath);try {out = new ByteArrayOutputStream();PdfWriter writer = PdfWriter.getInstance(document, out);document.open();XMLWorkerHelper.getInstance().parseXHtml(writer, document,new BufferedInputStream(htmlInputStream), Charset.forName("utf-8"), provider);document.close();inputStream = new ByteArrayInputStream(out.toByteArray());
                  if (inputStream != null) {                
                   try {                    
                         inputStream.close();                
                      } catch (IOException e) {                   
                          logger.error(e.getMessage(), e);               
                       }            
                    }           
                  if (out != null) {               
                    try {                    
                         out.close();                
                       } catch (IOException e) {                   
                         logger.error(e.getMessage(), e);               
                        }            
                       }        
                  }        return inputStream;    
     }

 
  }
这样的一个方法便实现了将html 流转为pdf流,其中解决中文问题的关键代码
XMLWorkerFontProvider provider = new XMLWorkerFontProvider();
provider.register(fontPath);
我自己下载了一个宋体字体,然后通过这个方法引入中文字体,simsun.ttf便是宋体字体,不过html模版里的字体要全部改为宋体,至此中文问题解决了,传入一个html文件的输入流掉用这个方法便得到了一个PDF输出流,特别注意,这个方法返回的是一个字节流,不是字符流,如果你用字符流的方法写入文件生成的PDF文件是打不开的。
那么很多人又遇到问题了,字节流如何写入文件,当然网上有很多方法,通过定义一个缓冲区然后用InputStream的read()方法一段一段读,再用OutputStream的write()方法一段一段写,这里我给大家一个很好(懒)的方法,
IOUtil.copyCompletely(InputStream input, OutputStream output);这是javaIO包直接给我们封装好的方法,看下这个方法的源码,
最后提一点关于流要注意的问题,我们用完流之后一定记得关闭流啊,否则会有各种问题的,还需注意的是我们关闭流的代码的位置,不要觉得我上面的代码太冗余了,流的关闭不应该放在try{}catch(){}中,为什么呢?如果你的代码执行到中途抛异常了,而你关闭流的代码在异常代码后面,那问题就来了,你关闭流的代码已经执行不到了,各个流的关闭也不要写在一个try{}catch(){}中,还是这个问题,close()方法会抛异常,如果一个流的close()方法抛异常流,就会导致它后面的流执行不到关闭流的代码。还有上面方法中第一个document.close();不可省略,document不关闭,转换后的流是写不到out里的,那样生成的PDF文件是空,不能打开。第二个document.close()是因为.parseXHtm()方法会抛异常,如果这里抛了异常,那么后面的close()便执行不到了,所以需要在异常处理里关闭。

public static void copyCompletely(InputStream input, OutputStream output) throws IOException {if(output instanceof FileOutputStream && input instanceof FileInputStream) {try {FileChannel buf1 = ((FileOutputStream)output).getChannel();FileChannel ignore1 = ((FileInputStream)input).getChannel();ignore1.transferTo(0L, 2147483647L, buf1);ignore1.close();buf1.close();return;} catch (Exception var6) {;}}byte[] buf = new byte[8192];while(true) {int ignore = input.read(buf);if(ignore < 0) {try {input.close();} catch (IOException var5) {;}try {output.close();} catch (IOException var4) {;}return;}output.write(buf, 0, ignore);}
}
这个方法会先判断输入流是字节流还是文件流,然后根据不同的流选择不同的方法,就不用我们自己去判断到底是字符流还是字符流了,无脑调这个方法便是,当然它对字节流的实现还是依然是我上面说的方法,但是不用我们自己写了啊。
    public static void main(String[] args) throws IOException{String html = "/Users/feixiaobo/Desktop/test.html";String pdf = "/Users/feixiaobo/Desktop/test.pdf";File pdfFile = new File(pdf);InputStream inputStream = htmlToPDF(new FileInputStream(new File(html)));try{if(!pdfFile.exists()){pdfFile.createNewFile();}}catch (IOException e ){
      //}IOUtil.copyCompletely(inputStream,new FileOutputStream(pdf));}
       } catch (DocumentException e) {logger.error(e.getMessage(), e);} catch (IOException e) {document.close();logger.error(e.getMessage(), e);} 
       finally {            

iText实现html转pdf相关推荐

  1. IText实现url转pdf, 解决中文字体问题

    IText实现url转pdf 入门文章:http://www.micmiu.com/opensource/expdoc/itext-pdf-demo/ 进阶文章:http://www.micmiu.c ...

  2. itext html 转换 pdf文件,利用itext实现html转pdf文档

    Link: http://keyknight.blog.163.com/blog/static/366378402009431104941637/ 利用itext实现html转pdf文档的代码实在是太 ...

  3. java使用itext将图片放到pdf模板的指定位置

    java使用itext将图片放到pdf模板的指定位置 前面的准备步骤可以参考我的上一篇文章 这里直接上代码 这里用的图片是路径的形式,还有种情况是图片是base64的时候,这种情况就需要转一下图片格式 ...

  4. itext根据数据生成PDF

    前言: 使用模板的方式开生成PDF文件 1.下载Adobe Acrobat DC,使用正式版(可以试用7天) 2.打开模板编辑表单域: 选择工具–>准备表单 3.编辑文本域属性 根据要求的模板设 ...

  5. java iText 的jar导出pdf格式,禁止浏览器预览,直接下载功能

    后台使用iText来生成一个pdf文件,提供一个服务器的pdf访问地址,让前端拿到,浏览器下载,不过直接使用loaction.href的形式,浏览器都会默认进入一个预览的界面,这就导致很不好用,需要回 ...

  6. html2pdf页面大小,带有页面大小检测的itext 7 html到pdf(itext 7 html to pdf with page size detection)...

    带有页面大小检测的itext 7 html到pdf(itext 7 html to pdf with page size detection) 我使用itext 7将HTML模板(Velocity)呈 ...

  7. 使用itext和JasperReports生成PDF文档

    1>方法一Itext来实现生成文档这个pdf的文档 1.使用Itext来实现生成我都这个PDF的文档,代码如下 public static void main(String[] args) {t ...

  8. ITEXT将HTML转为PDF内容被截断处理及相关问题总结

    ITEXT将HTML转为PDF内容被截断处理及相关问题总结 文章目录 ITEXT将HTML转为PDF内容被截断处理及相关问题总结 前言 一.ITEXT将HTML转为PDF内容被截断处理(一) 1.问题 ...

  9. iText 合并多个 pdf 文件

    iText 合并多个 pdf 文件 iText 合并多个 pdf 文件 核心代码 完整的类代码 参考代码 参考来源 iText 合并多个 pdf 文件 核心代码 /*** 合并多个pdf** @par ...

  10. pdf按照页码分割 java_java使用itext按页码拆分pdf文件详解

    java使用itext按页码拆分pdf文件,代码实现如下: /** * @author viralpatel.net * * @param inputStream Input PDF file * @ ...

最新文章

  1. H5标准提供哪些新的API
  2. docker 删除默认连接_Net Core 中 Docker应用
  3. IT忍者神龟之Struts2.xml配置全然正确流程能走通可是有红叉解决
  4. 对计算机进行培训内容,对计算机培训的心得体会
  5. 云时代数据容灾的正确姿势
  6. 国内薪水最高的IT公司排行榜TOP25,大家都说说你们觉得这数据准确吗,我怎么觉得不太准确。。
  7. 传感器与检测技术基础知识(4)—— 电阻式传感器
  8. 买就赚到的以色列人工智能
  9. 持续更新:历年硕士研究生报考人数与录取人数统计
  10. 安卓各国语言对应缩写和时区查询
  11. 搜狗搜索图片查看器调用帮助
  12. 中国电压力锅市场盈利前景与未来发展趋势研究报告2022版
  13. windows 服务器使用量高导致网络异常
  14. laravel教程入门笔记
  15. python 概率分布函数_如何在Python中实现这五类强大的概率分布
  16. 蓝桥杯培训试题新解——计算两个日期之间的天数间隔
  17. 理解锁相环的工作原理
  18. 资料: 颜色RGB基础定义
  19. 如何找到一个网站的icon
  20. 2010.12.09_ximo_再来和谐下VMP2.07的脱壳

热门文章

  1. 解决IDEA支持GBK编码项目的问题
  2. CAUSALITY FOR MACHINE LEARNING
  3. java messagedigest_Java MessageDigest.getInstance返回的实例非线程安全
  4. BitTorrent详解
  5. 机器学习大牛李飞飞的电脑配置
  6. 匹配滤波器为何使得输出SNR最大?
  7. 电商购物后台管理系统总结
  8. 突出的就是一个「性价比」— 小新 Air 14 2020 评测
  9. CI框架的使用-环境搭建
  10. sqlite数据库可视化工具—— DB.Browser安装说明