首页 >pdf操作 > 内容

【Java】电子凭证-Java生成PDF

2023年9月25日 21:02

技术核心: HTML生成PDF

背景

在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等。方便用户查看,下载,打印。目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户。

电子凭证

本文文档:https://my.oschina.net/lujianing/blog/894365
本文源码:http://git.oschina.net/lujianing/java_pdf_demo

实现思路

对于电子凭证的技术方案,总结如下:

  1. html模板+model数据,通过freemarker进行渲染,便于维护和修改
  2. 渲染后的html流,可通过Flying Saucer组件生成pdf文件流,或者将其转成jpg文件流
  3. 在Web项目中,该文件流可以通过ContentType设置,在线查看/下载,不需通过附件服务

技术方案图

流程图

Template Engines(模板引擎)

有多种模板引擎技术可以对html模板进行动态渲染, 请自行选择

Thymeleaf

Apache Freemarker

Groovy Templates

velocity

HTML TO PDF 技术

html转换为pdf的关键技术是如何处理网页中复杂的css样式、以及中文乱码处理。

各实现对比表

在这里插入图片描述
在这里插入图片描述

WKhtmlTOpdf

HTML转化PDF步骤:

  1. 官网下载 wkhtmltopdf.exe
  2. 准备html文件路径或网址, eg: /opt/template.html, https://www.baidu.com/
  3. 执行wkhtmltopdf https://www.baidu.com/ baidu.pdf代码实现参考该工具类

优质源码:

参考源码:

iText

iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
iText 官网:http://itextpdf.com/
iText 开发文档: http://developers.itextpdf.com/developers-home
iText Knowledge Base: https://kb.itextpdf.com/home
iText目前有两套版本iText5和iText7。iText5应该是网上用的比较多的一个版本。iText5因为是很多开发者参与贡献代码,因此在一些规范和设计上存在不合理的地方。iText7是后来官方针对iText5的重构,两个版本差别还是挺大的。不过在实际使用中,一般用到的都比较简单,所以不用特别拘泥于使用哪个版本。

功能简介:

  • 最简单的例子 -> com.itextpdf:itextpdf:5.5.11 -> JavaToPdf

  • iText-中文支持 -> JavaToPdfCN

  • iText-Html渲染 -> com.itextpdf.tool:xmlworker:5.5.11 -> JavaToPdfHtml

  • iText-Html-Freemarker渲染 -> org.freemarker:freemarker:2.3.19 -> JavaToPdfHtmlFreeMarker

  • Flying Saucer-CSS高级特性支持 -> org.xhtmlrenderer:flying-saucer-pdf:9.1.5 org.xhtmlrenderer:flying-saucer-pdf-itext5:9.1.5 -> JavaToPdfHtmlFreeMarker

Flying Saucer is a pure-Java library for rendering arbitrary well-formed XML (or XHTML) using CSS 2.1 for layout and formatting, output to Swing panels, PDF, and images.
Flying Saucer是基于iText的,支持对CSS高级特性的解析

  • PDF转图片 -> org.jpedal:jpedal-lgpl:4.74b27 -> JavaToPdfImgHtmlFreeMarker

在某些场景中,我们可能只需要返回图片格式的电子凭证,我们可以使用Jpedal组件,把pdf转成图片
Jpedal支持将指定页Pdf生成图片,pdfDecoder.scaling设置图片的分辨率(不同分辨率下文件大小不同) ,支持多种图片格式,具体更多可自行研究

优质源码:

PhantomJS

纯前端解决方案, git地址: https://github.com/ariya/phantomjs
PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。 PhantomJS 可以用于 页面自动化 , 网络监测 , 网页截屏 ,以及 无界面测试 等。


参考文章:https://blog.csdn.net/hkk666123/article/details/118682505

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时候联系我们修改或删除,在此表示感谢。

特别提醒:

1、请用户自行保存原始数据,为确保安全网站使用完即被永久销毁,如何人将无法再次获取。

2、如果上次文件较大或者涉及到复杂运算的数据,可能需要一定的时间,请耐心等待一会。

3、请按照用户协议文明上网,如果发现用户存在恶意行为,包括但不限于发布不合适言论妄图

     获取用户隐私信息等行为,网站将根据掌握的情况对用户进行限制部分行为、永久封号等处罚。

4、如果文件下载失败可能是弹出窗口被浏览器拦截,点击允许弹出即可,一般在网址栏位置设置

5、欢迎将网站推荐给其他人,网站持续更新更多功能敬请期待,收藏网站高效办公不迷路。

      



登录后回复

共有0条评论