首页 > 编程语言 >Java 使用 wkhtmltopdf 生成 PDF 遇到的几个坑

Java 使用 wkhtmltopdf 生成 PDF 遇到的几个坑

时间:2022-12-13 21:56:23浏览次数:49  
标签:INFO 13 Java thread wkhtmltopdf TID PDF

wkhtmltopdf 使用本地文件生成 PDF

一般使用命令 wkhtmltopdf URL pdfPath 生成 PDF 文件,其中 URL 为 GET 请求地址。

但是笔者在做的项目是一个模板中心服务(后续代码整理好会上传到 Gitee),实现的功能是可以上传 Thymeleaf 的 HTML 模板文件,然后调用 GET 接口传入模板数据(Map 类型)后,直接返回生成的 PDF。既然使用 Map 传送模板数据,就不能使用 GET 请求了,一方面拼接 Map 比较麻烦,另一方面如果 Map 数据量过大可能超过 URL 长度限制。

印象中 wkhtmltopdf 可以通过本地文件转 PDF,遂尝试先调用 POST 接口将数据填充到模板中,拿到返回的 HTML 后写入到临时文件中,然后通过 wkhtmltopdf HTML pdfPath 将 HTML 文件转换为 PDF 文件。

但是程序怎么弄都不行,就是会报错:

2022-12-13 16:36:59,873 INFO  [TID: N/A] [pool-2-thread-1] utils.FileUtils: HtmlToPdfInterceptor ===> Loading page (1/2)
2022-12-13 16:36:59,873 INFO  [TID: N/A] [pool-2-thread-1] utils.FileUtils: HtmlToPdfInterceptor ===> [>                                                           ] 0%
2022-12-13 16:36:59,873 INFO  [TID: N/A] [pool-2-thread-1] utils.FileUtils: HtmlToPdfInterceptor ===> [======>                                                     ] 10%
2022-12-13 16:37:02,427 INFO  [TID: N/A] [pool-2-thread-1] utils.FileUtils: HtmlToPdfInterceptor ===> Error: Failed to load http://d/Source/secp-template-center/secp-template-service/target/classes/templates/thymeleaf/Seeds-Pro/test.html, with network status code 3 and http status code 0 - Host d not found
2022-12-13 16:37:02,428 INFO  [TID: N/A] [pool-2-thread-1] utils.FileUtils: HtmlToPdfInterceptor ===> Error: Failed loading page http:///D:/Source/secp-template-center/secp-template-service/target/classes/templates/thymeleaf/Seeds-Pro/test.html (sometimes it will work just to ignore this error with --load-error-handling ignore)
2022-12-13 16:37:02,428 INFO  [TID: N/A] [pool-2-thread-1] utils.FileUtils: HtmlToPdfInterceptor ===> Exit with code 1 due to network error: HostNotFoundError

但是同样的命令,直接在 cmd 里面就可以执行:

wkhtmltopdf 使用本地文件生成 PDF

搜索无果,官方 GitHub 也没找到有用信息,含同事来看也没发现问题,后来他在自己的 Mac 上拉代码跑了遍,发现正常,而我用的是公司发的 ThinkPad。。。

事后分析,是路径分隔符的问题,wkhtmltopdf 对 Windows 下的路径分隔符兼容性不好,通过 Path.of(first, more) 静态方法结合 File.separator构造路径就没有问题了。

OpenFeign 不支持 HttpServletResponse 问题

模板中心服务返回的 HttpServletResponse,OpenFeign 不支持,只能将文件转为 Base64 返回,另外的方法是使用 RestTemplate 或者 HttpClient

使用方 getOutputStream() has already been called for this response 错误

使用方通过 GET 请求获取 PDF 的时候,返回值必须是 void,因为返回文件使用的是 HttpServletResponse,而 SpringMVC 返回的时候也会使用 response 的 getOutputStream() 方法,而该方法只能调用一次。

标签:INFO,13,Java,thread,wkhtmltopdf,TID,PDF
From: https://www.cnblogs.com/ageovb/p/16980749.html

相关文章

  • java当中怎么测试异步接口【杭州多测师_王sir】【杭州多测师】
    测试是软件发布的重要环节,单元测试在实际开发中是一种常用的测试方法,java单元测试主要用junit,最新是junit5,本人开发一般用junit4。因为单元测试能够在软件模块组合之前尽快......
  • java Date 和 TimeStamp 互相转换
    1.Date转TimeStampDatedate=newDate();Timestampts=newTimestamp(date.getTime());2.TimeStamp转DateTimestampts=newTimestamp(System.currentTim......
  • 学习Java第二天
    打开CMD的方式:开始+系统+命令提示符Windows+R输入CMD3.在任意文件夹下面,按住shift键+鼠标右键点击,在此处打开命令型窗口4.资源管理器的地址栏前面加上cmd路径管理......
  • java自定义注解实现前后台参数校验
     其实是可以通过@Constraint来限定自定义注解的方法。@Constraint(validatedBy=xxxx.class) 下面是我做的java自定义注解实现前后台参数校验的代码示例对这个感兴趣的......
  • 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源、视图和消息器
     在上一篇博文​​《基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1)-数据源与事务管理》​​中我们介绍了怎么基于Java代码去设计和配置一个具有可扩展性的数......
  • 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
    经过​​《基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1)-数据源与事务管理》​​和​​《基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2)-静态资......
  • 伙伴福利,100个项目彻底精通Java!【开源】
    为了帮助更多的小伙伴,快速成长进步,冲进大厂中厂,我分享了很多的项目哟,例如:java项目精品实战案例|JavaSwing实战项目但很多小伙伴,还觉得不够,好吧!今天就拿出压箱底的项目......
  • Java类和对象2-API,String,ArrayList
    Java类和对象2-API,String,ArrayList如何使用帮助文档(API)先看这个类在哪个包里.看这个类的描述信息,知道这个类是干啥的.看构造方法.最后看成员方法,就是返回值,......
  • 伙伴福利,100个项目彻底精通Java!【开源】
    为了帮助更多的小伙伴,快速成长进步,冲进大厂中厂,我分享了很多的项目哟,例如:java项目精品实战案例|JavaSwing实战项目但很多小伙伴,还觉得不够,好吧!今天就拿出压箱底的项......
  • javaweb6
    3.EL表达式3.1介绍ExpressionLanguage表达式语言,应用于JSP页面,可以更简单、便捷的获取page、request.session,application等作用于的值,进行渲染。等作用于的值,进行渲......