RestPack Java实现Html转PDF文件
最近公司需要将前端一个图表统计导出为pdf。前端导出显示的pdf还是可以的,但是将会导致页面不可用与卡死状态。所以由后端寻找解决方案。
以下为解决方案调研
https://www.cnblogs.com/IT-study/p/13706690.html
由于自己开发一个公共的导出pdf功能比较费时费力,而且导出过程中也遇到了各种样式问题。考虑再三决定使用第三方导出来解决这个问题。
好处:接入简单给个H5url即可,无需要考虑导出中遇到的写出的样式与排版问题
坏处:无法做到完全自定义。拿restPack举例子 ,导出长图无法自定义宽度,目前导出有1280px宽度,业务需要手机预览宽度只要 A6纸的规格即可。也可能可以通过js、css参数去解决,我没找到对应的方法。
解决思路
1.将一个可访问的H5URL转换为Pdf文件 2.将Pdf文件写到页面
H5URL转换为Pdf文件
1 @Component
2 public class H5UrlExportPdf {
3
4
5 @Value("${restpack.token}")
6 private String token = "HA5jLSVtSnjl3fmlhPgTg7rPRE4OnywDvh1CrbanXmpBvNqA";
7
8
9 /**
10 * https://restpack.io/html2pdf/docs
11 */
12 public ReturnRestPackPdf exportPdf(RestPackPdfParameters restpackPdfParameters) throws IOException {
13
14
15 ReturnRestPackPdf returnRestPackPdf;
16
17 //请求URL
18 String reqUrl = "https://restpack.io/api/html2pdf/v6/convert";
19 StringBuilder stringBuilder = new StringBuilder();
20
21 //地址需要encode
22 String firstP = "url";
23 stringBuilder.append(firstP).append("=").append(restpackPdfParameters.getUrl());
24
25 Map<String, String> describe = BeanHelper.describe(restpackPdfParameters);
26 describe.forEach((name, val) -> {
27
28 if (!firstP.equalsIgnoreCase(name)) {
29 stringBuilder.append("&").append(name).append("=").append(val);
30 }
31 });
32
33 System.out.println(stringBuilder.toString());
34
35 byte[] postData = stringBuilder.toString().getBytes(StandardCharsets.UTF_8);
36 HttpURLConnection con = null;
37
38 try {
39
40 URL myUrl = new URL(reqUrl);
41 con = (HttpURLConnection) myUrl.openConnection();
42
43 con.setDoOutput(true);
44 con.setRequestMethod("POST");
45 con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
46 con.setRequestProperty("x-access-token", token);
47
48 try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
49 wr.write(postData);
50 }
51
52 StringBuilder content;
53
54 try (BufferedReader in = new BufferedReader(
55 new InputStreamReader(con.getInputStream()))) {
56
57 String line;
58 content = new StringBuilder();
59
60 while ((line = in.readLine()) != null) {
61 content.append(line);
62 content.append(System.lineSeparator());
63 }
64 }
65
66 returnRestPackPdf = JSONObject.parseObject(content.toString(), ReturnRestPackPdf.class);
67
68 } finally {
69 if (con != null) {
70 con.disconnect();
71 }
72 }
73
74 return returnRestPackPdf;
75 }
76
77
78 }
H5URL导出文档入参
1 @Data
2 public class RestPackPdfParameters implements Serializable{
3
4 private static final long serialVersionUID = 1L;
5
6
7 /**
8 * 需要导出文档H5URL
9 * The URL of web page, including the protocol that you want to capture.
10 * Example: http://example.com
11 */
12 private String url;
13
14
15 /**
16 * Return a JSON response with the resulting image's URL instead of the image itself.
17 * Default: false
18 */
19 private Boolean json = true;
20
21
22 /**
23 * Page size for created document
24 *
25 * Default: Full
26 * Pattern: A0 | A1 | A2 | A3 | A4 | A5 | A6 | Legal | Letter | Tabloid | Ledger | Full
27 *
28 * Legal:width 816 多张图片阶段
29 * Letter:width 816 多张图片阶段
30 * Tabloid:width 1056 多张图片阶段
31 * Ledger:width 1632 多张图片阶段
32 * Full:width 1280 一张图片
33 */
34 private String pdf_page="Full";
35
36 public RestPackPdfParameters() {
37 }
38
39 public RestPackPdfParameters(String url) {
40 this.url = url;
41 }
42 }
H5URL导出文档返回参数
1 @Data
2 public class ReturnRestPackPdf implements Serializable{
3
4 private static final long serialVersionUID = 1L;
5
6
7 private Boolean cached;
8 private String content_type;
9 /** pdf文件类型地址 */
10 private String file;
11 private Integer height;
12 private Integer width;
13 /** pdf图片类型地址 */
14 private String image;
15 private String length;
16 private String remote_status;
17 private String run_time;
18 private String url;
19
20 }
将文件写到页面
1 private void downFileHtml(String name, @RequestParam(value = "fileUrl", required = false) String fileUrl, HttpServletResponse response, Boolean useName) {
2 BufferedInputStream bis = null;
3 BufferedOutputStream bos = null;
4 OutputStream output = null;
5 try {
6 log.info("downLoadFileStart:" + fileUrl);
7 response.setContentType("application/octet-stream; charset=UTF-8");
8 if (useName) {
9
10 } else {
11 String ext = fileUrl.substring(fileUrl.lastIndexOf("."));
12 name = name + ext;
13 name = URLDecoder.decode(name, "UTF-8");
14 }
15
16 response.setHeader("Content-Disposition", "attachment;fileName=\"" + new String(name.getBytes("GBK"), "ISO8859-1") + "\"");
17
18 URL url = new URL(fileUrl);
19 bis = new BufferedInputStream(url.openStream());
20 output = response.getOutputStream();
21 bos = new BufferedOutputStream(output);
22 log.info("downLoadFileCopyStream:" + fileUrl);
23 byte[] buff = new byte[2048];
24 int bytesRead;
25 while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
26 log.info("downLoadFileCopyStreamDetail:" + bytesRead);
27 bos.write(buff, 0, bytesRead);
28 }
29 log.info("downLoadFileEnd:" + fileUrl);
30 } catch (Exception e) {
31 log.error("downLoadFileError:" + fileUrl + ":error:" + e.getMessage());
32 e.printStackTrace();
33 } finally {
34 try {
35 if (bos != null) {
36 bos.flush();
37 bos.close();
38 }
39 if (bis != null) {
40 bis.close();
41 }
42 if (output != null) {
43 output.close();
44 }
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 }
49 }
使用事项
1.url 为转换pdf的页面地址,改地址必须能直接访问(无登录功能) 2.pdf_page 有几个页面规格 A0 | A1 | A2 | A3 | A4 | A5 | A6 | Legal | Letter | Tabloid | Ledger | Full 。Full可导出一张长图,但是宽度不可定。其他的规格与A4类似,导出的是多张图片。 3.pdf_width 、pdf_height 可自定义页面规格。一旦pdf_page设置,pdf_width pdf_height必须为空。 4.一旦付费成功 css、js 可进行调节生成pdf文件产生的样式问题。 5.我们需要导出一整张图片,但是一整张图的宽度不可自定义。导出的宽度为1280px,手机上显示只需要800px。目前这个问题还不知道怎么解决
RestPack Java实现Html转PDF文件的更多相关文章
- java 用PDFBox 删除 PDF文件中的某一页
依赖: <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-app ...
- 利用aspose-words 实现 java中word转pdf文件
利用aspose-words 实现 java中word转pdf文件 首先下载aspose-words-15.8.0-jdk16.jar包 引入jar包,编写Java代码 package test; ...
- java操作Excel、PDF文件
java操作Excel.PDF文件 分享者:Vashon 分享来源:CSDN博客 下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是贴出了关于操作EXCEL的代码: jxl是一个*国人写的 ...
- 01.在Java中如何创建PDF文件
1.简介 在这篇快速文章中,我们将重点介绍基于流行的iText和PdfBox库从头开始创建 PDF 文档. 2. Maven 依赖 <dependency> <groupId> ...
- PDF技术 -Java实现Html转PDF文件
转载:https://blog.csdn.net/qq_34190023/article/details/82999702 html转换为pdf的关键技术是如何处理网页中复杂的css样式.以及中文乱码 ...
- java调用wkhtmltopdf生成pdf文件,美观,省事
最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...
- Java 使用PDFBox提取PDF文件中的图片
今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存.使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容 ...
- 利用java实现excel转pdf文件
在有些需求当中我们需要抓取字段并且填充到excel表格里面,最后将excel表格转换成pdf格式进行输出,我第一次接触这个需求时,碰到几个比较棘手的问题,现在一一列出并且提供解决方案. 1:excel ...
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...
随机推荐
- 不要以为Bug写的好就是好程序员,其实这只占不到15%!
最近和一位从事多年架构工作的技术哥们见面,聊到了近期面试程序员的一些经历,谈到了"如何判断程序员水平高低"这个话题,颇有些感触,觉得有价值,因此花了些时间整理.分享给大家. 正 ...
- 【编程学习笔记】如何组织构建多文件 C 语言程序!编程也有~
优秀 Unix 程序哲学 首先,你要知道这个 C 程序是一个 Unix 命令行工具.这意味着它运行在(或者可被移植到)那些提供 Unix C 运行环境的操作系统中.当贝尔实验室发明 Unix 后,它从 ...
- ansible使用file模块管理受控机的目录与文件(ansible2.9.5)
一,ansible的file模块的用途 file 模块实现对文件的基本操作. 例如: 创建文件或目录 删除文件或目录 修改文件权限等 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https:// ...
- ansible的copy模块应用(ansible 2.9.5)
一,copy模块的作用: 复制文件到受控的远程主机 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest 对应的源码可以访问 ...
- 数组列表(ArrayList)
2020-10-20 longzqa@163.com stronglzq [摘要]针对数组容量固定无法扩展的问题,引入数组列表(ArrayList).主要对数组列表的声明及 ...
- Linux的安全模型
3A 资源分派: Authentication:认证,验证用户身份 Authorization:授权,不同的用户设置不同权限 Accouting|Audition:审计 当用户登录成功时,系统会自动分 ...
- Linux入门到放弃之八《任务计划管理》
任务计划管理 1.每周一下午5:50将/data目录下的所有目录和文件归档并压缩为:backup.tar.gz 放在/home/backup目录下. 先新建/data目录,并在目录中随意生成几个文件 ...
- v s
关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且只能修改变量,而synchronized可以修饰方法,以及代码块. ...
- Mybatis初学经验----------------(2)
至于myBatis的配置,上篇文章中有,就不说了.今天谈谈myBatis编写Dao层时的用法. 传统Dao层代码需求 1.在Dao层实现类中,存在大量的模板方法,能否提取模板方法,减少我们的工作量. ...
- element ui实现form验证起始时间不能大于结束时间
<el-form-item label="开始时间" :label-width="formLabelWidth" prop="startTime ...