最近公司需要将前端一个图表统计导出为pdf。前端导出显示的pdf还是可以的,但是将会导致页面不可用与卡死状态。所以由后端寻找解决方案。

以下为解决方案调研

https://www.cnblogs.com/IT-study/p/13706690.html

由于自己开发一个公共的导出pdf功能比较费时费力,而且导出过程中也遇到了各种样式问题。考虑再三决定使用第三方导出来解决这个问题。

好处:接入简单给个H5url即可,无需要考虑导出中遇到的写出的样式与排版问题

坏处:无法做到完全自定义。拿restPack举例子 ,导出长图无法自定义宽度,目前导出有1280px宽度,业务需要手机预览宽度只要 A6纸的规格即可。也可能可以通过js、css参数去解决,我没找到对应的方法。

官网https://restpack.io/

解决思路

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文件的更多相关文章

  1. java 用PDFBox 删除 PDF文件中的某一页

    依赖: <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-app ...

  2. 利用aspose-words 实现 java中word转pdf文件

    利用aspose-words  实现 java中word转pdf文件 首先下载aspose-words-15.8.0-jdk16.jar包 引入jar包,编写Java代码 package test; ...

  3. java操作Excel、PDF文件

    java操作Excel.PDF文件 分享者:Vashon 分享来源:CSDN博客 下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是贴出了关于操作EXCEL的代码: jxl是一个*国人写的 ...

  4. 01.在Java中如何创建PDF文件

    1.简介 在这篇快速文章中,我们将重点介绍基于流行的iText和PdfBox库从头开始创建 PDF 文档. 2. Maven 依赖 <dependency> <groupId> ...

  5. PDF技术 -Java实现Html转PDF文件

    转载:https://blog.csdn.net/qq_34190023/article/details/82999702 html转换为pdf的关键技术是如何处理网页中复杂的css样式.以及中文乱码 ...

  6. java调用wkhtmltopdf生成pdf文件,美观,省事

    最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...

  7. Java 使用PDFBox提取PDF文件中的图片

    今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存.使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容 ...

  8. 利用java实现excel转pdf文件

    在有些需求当中我们需要抓取字段并且填充到excel表格里面,最后将excel表格转换成pdf格式进行输出,我第一次接触这个需求时,碰到几个比较棘手的问题,现在一一列出并且提供解决方案. 1:excel ...

  9. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

随机推荐

  1. 在VC6.0下运行C语言程序,以及编程入门必备的常识类小知识!

    今天给大家分享在VC6.0环境下编写C语言程序的基本步骤,为初学者打开学习C语言的第一道门.具体步骤如下(如果需要软件资源,可以留言): 1)新建工作区 依次点击 文件--新建--工作区 或是Ctrl ...

  2. 【状态压缩DP】SCOI2009 围豆豆

    题目大意 洛谷链接 在一个\(N×M\)的矩阵方格内分布着\(D\)颗豆子,每颗豆有不同的分值\(V_i\).游戏者可以选择任意一个方格作为起始格,每次移动可以随意的走到相邻的四个格子,直到最终又回到 ...

  3. JS获取指定月份的天数几种方法

    最近看到一个有意思的试题,正好在需求中也碰到类似的问题,即计算某个月的天数问题.碰到类似问题也许大部分会想是不是还要判断闰年.平年,如果这样想的话就复杂了,下面给出具体的计算方法. 获取月份天数方法一 ...

  4. CentOS 6编译安装RabbitMQ

    编译安装Python 下载python源文件 [root@localhost src]# tar -xzvf python-2.7.11.tar.gz [root@localhost src]# cd ...

  5. 第十二章 LNMP架构之分离数据库

    一.课程回顾 1.搭建LNMP环境 1.配置官方源2.yum安装依赖3.yum安装nginx4.配置nginx5.创建用户6.启动并加入开机自启​7.上传安装包8.解压安装包9.卸载旧版本PHP10. ...

  6. cgdb安装

    cgdb官网:http://cgdb.github.io/ 一.cgdb安装 可使用wget命令下载,wget  http://cgdb.me/files/cgdb-0.7.0.tar.gz 之后解压 ...

  7. typora的快捷键文档

    一:菜单栏 文件:alt+F 编辑:alt+E 段落:alt+P 格式:alt+O 视图:alt+V 主题:alt+T 帮助:alt+H 二:文件 新建:Ctrl+N 新建窗口:Ctrl+Shift+ ...

  8. WTM系列教学视频全免费

    WTM框架问世以来,受到越来越多开发者的喜爱,为了回报大家的厚爱,原本在CSDN上的教学视频已经全部免费,900多分钟的视频,而且还会继续更新. 为了方便大家观看,在B站上也同步更新,地址如下: CS ...

  9. vue-cli3搭建的vue项目中使用jquery

    装包:npm install jquery --save 方式一 全局使用 1)main.js中引入 // jquery import $ from 'jquery' Vue.prototype.$ ...

  10. Docker(8)- docker search 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 从 Docker Hub ...