近期由于工作需要,需要将html代码导入到pdf中,经过了几种pdf的方案对比后发现IText是最简单和便捷的一种方式,于是乎采用了Itext。

PDF生成

第一步:导入Maven依赖

<!--pdf生成工具类--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.2</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.4.1</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.0.3</version></dependency>

第二步:直接上代码

public static void main(String[] args) throwsIOException{String html= PDFKit.readFileByUrl("http://127.0.0.1/export/1/1"); // 将html代码读取到html字符串中try{Document document= newDocument();PdfWriter mPdfWriter= PdfWriter.getInstance(document, new FileOutputStream(new File("C:\\data\\3.pdf")));document.open();ByteArrayInputStream bin= newByteArrayInputStream(html.getBytes());XMLWorkerHelper.getInstance().parseXHtml(mPdfWriter, document, bin,null, newChinaFontProvide());System.out.println("生成完毕");document.close();}catch(Exception e) {e.printStackTrace();}}public static final class ChinaFontProvide implementsFontProvider{@Overridepublic booleanisRegistered(String s){return false;}@Overridepublic Font getFont(String arg0, String arg1, boolean arg2, float arg3, intarg4, BaseColor arg5){BaseFont bfChinese= null;try{bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);}catch(Exception e){e.printStackTrace();}Font FontChinese= new Font(bfChinese, 12, Font.NORMAL);returnFontChinese;}}

另附PDFKit.java工具类

public staticString readFileByUrl(String urlStr) {String res=null;try{URL url= newURL(urlStr);HttpURLConnection conn=(HttpURLConnection)url.openConnection();//设置超时间为3秒conn.setConnectTimeout(3*1000);//防止屏蔽程序抓取而返回403错误conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");//得到输入流InputStream inputStream =conn.getInputStream();res=readInputStream(inputStream);}catch(Exception e) {log.error("通过url地址获取文本内容失败 Exception:" +e);}returnres;}/*** 从输入流中获取字符串*@paraminputStream*@return*@throwsIOException*/public static String readInputStream(InputStream inputStream) throwsIOException {byte[] buffer = new byte[1024];int len = 0;ByteArrayOutputStream bos= newByteArrayOutputStream();while((len = inputStream.read(buffer)) != -1) {bos.write(buffer,0, len);}bos.close();//System.out.println(new String(bos.toByteArray(),"utf-8"));return new String(bos.toByteArray(),"utf-8");}

至此 dpf就可以到下面路径中查看了

C:\\data\\3.pdf

PDF预览

只需在页面中增加如下代码即可

<html>
<head><title>Title</title>
</head>
<body>
<body style="height: 100%; width: 100%; overflow: hidden; margin: 0px;">
<embed width="100%" height="100%" src="pdf/3.pdf" type="application/pdf" internalinstanceid="25"/>
</body>
</body>
</html>

注意:html文档一定是<html>,不可以是<!DOCTYPE html> 不然body的100% 会失去效果

预览效果

特别说明

如上代码生成的pdf,如果直接用工具打开后发现字体是没有问题,但是嵌套在网页后发现字体竟然不是宋体了,下面我们来介绍下IText输出中文的三种字体的选择方式

1、使用iTextAsian.jar中的字体BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);2、使用Windows系统字体(TrueType)BaseFont.createFont("C:/WINDOWS/Fonts/SIMLI.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);3、使用资源字体(ClassPath)BaseFont.createFont("/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); //下面着重介绍

上面是设置字体的方式,刚刚咱们用的第一种方式,所以pdf预览的的时候字体会变,改用下面的方式就没有任何问题了,下面咱们说下标红的是什么意思

由于项目使用的是springboot,所以发布到liunx后并不能直接从jar中查找相应的字体,要改用ClassPathResource的方式获取,因此更换代码如下:

 ClassPathResource resource = new ClassPathResource("static/STSONG.TTF");bfChinese= BaseFont.createFont(resource.getURL().toString(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

可将STSONG.TTF直接放入resources文件夹根目录即可

这样windows和linux都可以正确的生成pdf并预览了。更换后的效果:

另附:常用字体

//楷体字BaseFont bfComic = BaseFont.createFont("c://windows//fonts//simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//方正舒体BaseFont bfComic = BaseFont.createFont("c://windows//fonts//FZSTK.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//方正姚体BaseFont bfComic = BaseFont.createFont("c://windows//fonts//FZYTK.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//仿宋体BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//黑体BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文彩云BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STCAIYUN.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文仿宋BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STFANGSO.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文细黑BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STXIHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文新魏BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STXINWEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文行楷BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STXINGKA.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文中宋BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STZHONGS.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//隶书BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//宋体-方正超大字符集BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SURSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//幼圆
BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

开开心心编码,快快乐乐生活。

一次java导出pdf的经历相关推荐

  1. java 导出pdf_一次java导出pdf的经历

    近期由于工作需要,需要将html代码导入到pdf中,经过了几种pdf的方案对比后发现IText是最简单和便捷的一种方式,于是乎采用了Itext. PDF生成 第一步:导入Maven依赖 com.ite ...

  2. java导出pdf_一次java导出pdf的经历

    近期由于工作需要,需要将html代码导入到pdf中,经过了几种pdf的方案对比后发现IText是最简单和便捷的一种方式,于是乎采用了Itext. PDF生成 第一步:导入Maven依赖 com.ite ...

  3. 咖啡汪日志——JAVA导出pdf文件加水印 文字+图片、文字

    咖啡汪日志--JAVA导出pdf文件加水印 文字和图片.文字 hello,又大家见面了! 作为一只不是在戏精就是在戏精路上的哈士奇,今天要展示给大家的就是如何快捷地给pdf文件增加各种水印.嗷呜呜,前 ...

  4. JAVA导出PDF并压缩成zip

    JAVA导出PDF借助 iText pom先引入两个jar包 <dependency><groupId>com.itextpdf</groupId><arti ...

  5. 使用java导出pdf文件

    使用java导出pdf文件 itext itext的使用 JasperReports JasperReports与itext的区别 Jaspersoft Studio 工具简介 Jaspersoft ...

  6. java导出PDF(itextpdf+Adobe Acrobat 9 Pro)

    java导出PDF 背景 摸索 maven依赖 代码实现 模板及结果展示 模板 结果 彩蛋 彩蛋一:本地临时文件删除不了 彩蛋二:导出横向A4PDF 彩蛋三:多个PDF合并(待完成) 背景 最近接到一 ...

  7. java导出PDF、iText5导出漂亮表格PDF、导出指定格式水印PDF

    我们在项目当中经常要导出pdf文档,pdf文档还要按一定的格式导出,以下介绍导出pdf文档功能: 1)支持A4纸大小导出 2)指定文字显示的位置 3)支持表格展示数据 4)添加水印 开源下载 java ...

  8. 「Java工具类」pdf导出工具类java导出pdf文件工具类

    介绍语 本号主要是Java常用关键技术点,通用工具类的分享:以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+d ...

  9. java导出pdf功能记录

    这几天已在做处理导出pdf文件的功能,摸索了几天总算可以了.记录下这几天遇到的问题. 1.网上基本都是基于Itext5和Itext7来处理的.我最终是在Itext5上成功了,itext7应该是模板出问 ...

最新文章

  1. C++类内存分布——深度理解继承与虚函数
  2. 【(Python解释器、Pycharm)安装教程】【使用PyCharm编写第一个Python程序】
  3. oracle查看和替换含不可见字符(空白)
  4. “非常有用”的JavaScript 和 CSS 库插件推荐
  5. JSONSerializer把类转换成JSON字符串
  6. 【DevExpress】 SearchLookUpEdit
  7. CSDN、sina博客在Zoundry中登记的API URL 收藏
  8. intellij 上导入外部包教程
  9. 中级通信工程师考试之六移动通信
  10. MFC CImage透明图片显示
  11. [词根词缀]dic/dign/divid/doc/dom由来及词源D故事
  12. rust+mysql+prep+exec_Rust + Flutter 高性能的跨端尝试
  13. 人体红外传感器和光敏传感器检测问题
  14. android 8.1 9.0 10.0 Launcher3禁止拖拽app图标到第一屏
  15. 拼多多店铺数据分析有什么作用?哪些数据是有用的?
  16. Teamwork(The first day of the team)
  17. 计算机CQ,[计算机软件及应用]CQ使用简介.ppt
  18. 股票网页下单接口怎么知道出场讯号?
  19. snipaste如何滚动截图_电脑截图工具指南,截图还能这样玩?
  20. lisp调用vlx模块_CAD二次开发,lisp程序生成应用程序VLX,如何在CAD里面创建一个快捷图标,点击快捷图标就可以调用程序?...

热门文章

  1. 前端er怎样操作剪切复制以及禁止复制+破解等
  2. Django Channels 入门指南
  3. django如何给上传的图片重命名(给上传文件重命名)
  4. 关于mysql存储大数据的问题
  5. LAMPLNMP自动化安装脚本
  6. 加法器的verilog实现(串行进位、并联、超前进位、流水线)
  7. 三条Windows 7小技巧
  8. 技巧心得:Linux技巧小总结
  9. SEED实验系列:ShellShock 攻击实验
  10. linux+后台运行+nohup,Linux后台运行命令集(、fg、bg、jobs、nohup、ctrl + z)