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文件的读取.本篇博客只是讲解简单应 ...
随机推荐
- composer 阿里云加速 转
阿里云 Composer 全量镜像 本镜像与 Packagist 官方实时同步,推荐使用最新的 Composer 版本. 最新版本: 1.10.8 下载地址: https://mirrors.aliy ...
- spring boot:使用mybatis访问多个mysql数据源/查看Hikari连接池的统计信息(spring boot 2.3.1)
一,为什么要访问多个mysql数据源? 实际的生产环境中,我们的数据并不会总放在一个数据库, 例如:业务数据库:存放了用户/商品/订单 统计数据库:按年.月.日的针对用户.商品.订单的统计表 因为统计 ...
- linux(centos8):用fallocate快速生成大文件
一,fallocate的用途? 1,用途 我们有时需要用大文件来测试下载速度, 有时需要用大文件来覆盖磁盘空间, 如果在网上搜索,很多文章讲的是使用dd等工具, 事实上linux系统已经内置了生成大文 ...
- 【Azure云服务 Cloud Service】如何在部署云服务Cloud Service时候通过启动任务Start Task来配置IIS (如开启ARR)
问题情形 通过VS部署Cloud Service时,需要在开始任务时候安装或配置其他任务,如安装及配置ARR. 执行步骤 1) 下载 requestRouter_amd64.msi 和 webfarm ...
- Helium文档14-WebUI自动化-hover鼠标悬浮
前言 hover 实现功能是将鼠标光标悬停在给定的元素或点上 入参介绍 element def hover(element): """ :param element: T ...
- Window Mysql 解压安装
下载MySQL zip文件 解压后没有data文件夹和my.ini文件, 在根目录下创建my.ini文件,输入如下内容 以管理员身份运行cmd ,进入bin目录 ,运行下列命令,即可. a) mysq ...
- 蓝桥杯2020 E:七段码
题解 正规解法是 dfs + 并查集,首先用 dfs 将其所有的情况枚举出来,再用并查集来判断是否在一个连通块上. 许多小伙伴计算的答案为76,主要是判断连通块这方面有问题,倘若不用并查集,直接枚举一 ...
- String字符串性能优化的探究
一.背景 String 对象是我们使用最频繁的一个对象类型,但它的性能问题却是最容易被忽略的.String 对象作为 Java 语言中重要的数据类型,是内存中占用空间最大的一个对象,高效地使用字符串, ...
- C语言知识点复习梳理
C语言知识点复习梳理 C语言的知识点讲完了,接下来就是做一下整理与总结,然后就会进入其他知识的学习. 本文目录如下: 基础知识. 顺序程序设计. 数据类型. 标准输入输出. 进制转换. 选择结构. 循 ...
- POI Excel 导入导出重点
HSSF是指2007年以前的,XSSF是指2007年版本以上的 这个还是比较好用的,这些总结来自Apache的官方向导的点点滴滴 详细的请参考http://poi.apache.org/spreads ...