最近公司需要将前端一个图表统计导出为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. centos8平台用ffprobe获取视频文件信息(ffmpeg4.2.2)

    一,ffprobe的作用 ffprobe是强大的视频分析工具, 用于从多媒体流中获取相关信息或查看文件格式信息, 并以可读的方式打印 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https:// ...

  2. 第五章 NFS、rsync等统一用户相关操作

    一.统一用户 1.httpd2.NFS挂载目录3.rsync 1.所有服务器统一创建用户 [root@web01 ~]# groupadd www -g 666[root@web01 ~]# user ...

  3. 详解Kubernetes微服务自动化发布系统

    实施微服务架构后,原先单一的系统结构统变成了数量众多的微服务应用,开发.测试.运维部署等都会面临不少挑战.在微服务架构下如何提高工程研发效率,确保开发.测试.运维部署等流程上的顺畅,是微服务技术体系能 ...

  4. matplotlib中文标签乱码

    在python的安装目录下 找到~\Lib\site-packages\matplotlib\mpl-data 将字体文件(例如黑体SimHei.ttf,一般C:\Windows\Fonts路径下就有 ...

  5. Django( 学习第五部 Django之模板语法)

    目录 模板语法 --- 传值 摸板语法 --- 过滤器 模板语法 --- 标签 自定义过滤器.标签.inclusion_tag 模板的继承 模板语法 --- 传值 {{}}       变量相关 {% ...

  6. Spring学习-Bean的基本概念知识

    4月份开始复习一遍spring相关知识.让自己巩固一下spring大法的深奥益处,所以就看了大佬的博客,转载留下来日后继续研读.认为重点的标记为红色 转载自:http://www.cnblogs.co ...

  7. Redis学习笔记(八)——持久化

    一.介绍 Redis的所有的数据都存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为"半持久化模式"):也可以把每一次数据变化都写入到一个append only file(a ...

  8. Java安全之Commons Collections5分析

    Java安全之Commons Collections5分析 文章首发:Java安全之Commons Collections5分析 0x00 前言 在后面的几条CC链中,如果和前面的链构造都是基本一样的 ...

  9. C语言函数的学习

    0x01.函数 这节就先讲函数吧,函数大致分为四种类型 1.无参数.无返回值的函数格式 void 函数名() { //代码段 } void Hello() { printf("Hello W ...

  10. error:docker-ce conflicts with 2:docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64

    问题原因:安装docker之前有安装cockpit-docker服务 解决方法:卸载docker-ce [root@localhost ~]# yum list installed | grep do ...