如何在Mule 4中将JSON写入PDF及解决加载失败错误
在Mule 4中将JSON转换为PDF并修复加载失败问题
先说说你遇到的错误原因
兄弟,你现在的配置犯了一个很直观的错误:你只是把传入的JSON payload以纯文本形式写入了一个后缀为.pdf的文件,但这根本不是真正的PDF文件!PDF是一种特定格式的二进制文件,不是随便改个扩展名就能变成PDF的,所以你的PDF阅读器才会报错“Failed to load PDF document”——它打开的其实是个JSON文本,自然识别不了。
正确的JSON转PDF实现方法
Mule 4本身没有直接把JSON转PDF的原生组件,我们通常用两种方案来实现:
方案一:用Mule PDF模块(官方生态推荐)
这个方案是最省心的,利用Mule的PDF模块先把JSON转成HTML,再把HTML转成标准PDF:
第一步:安装PDF模块
在Anypoint Studio的Exchange中搜索PDF Module,选择和你Mule 4.2.1兼容的版本安装到项目里。第二步:修改你的Flow配置
把原来直接写JSON的流程改成“JSON→HTML→PDF→写入文件”的流程,示例配置如下:
<?xml version="1.0" encoding="UTF-8"?> <mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:pdf="http://www.mulesoft.org/schema/mule/pdf" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd http://www.mulesoft.org/schema/mule/pdf http://www.mulesoft.org/schema/mule/pdf/current/mule-pdf.xsd"> <http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" doc:id="79ef9cde-39c4-449a-8cac-9aeb3be30c27" > <http:listener-connection host="0.0.0.0" port="8084" /> </http:listener-config> <file:config name="File_Config" doc:name="File Config" doc:id="d67cbdb7-3bc8-4f04-8d7f-862c539f5f3f" > <file:connection workingDir="D:\Devendra\workspace_dev\mule4\pdf\src\main\resources\pdf" /> </file:config> <flow name="pdfFlow" doc:id="eaef4b93-c6f1-4e01-9df3-93e2ba2dcba4" > <http:listener doc:name="Listener" doc:id="1407afe8-dbea-4f67-8514-29b8039c5638" config-ref="HTTP_Listener_config" path="/pdf"/> <!-- 把JSON转换成结构化的HTML --> <ee:transform doc:name="JSON to HTML" doc:id="transform-html"> <ee:message> <ee:set-payload><![CDATA[%dw 2.0 output application/html --- "<html><body><h1>JSON转PDF结果</h1>" ++ "<table border='1'><tr><th>字段</th><th>值</th></tr>" ++ (payload pluck ((value, key) -> "<tr><td>" ++ key as String ++ "</td><td>" ++ value as String ++ "</td></tr>") joinBy "") ++ "</table></body></html>"]]></ee:set-payload> </ee:message> </ee:transform> <!-- 用PDF模块把HTML转成标准PDF二进制流 --> <pdf:generate-pdf doc:name="Generate PDF" doc:id="gen-pdf"/> <!-- 把真正的PDF二进制写入文件 --> <file:write doc:name="Write PDF" doc:id="write-pdf" path="test.pdf" config-ref="File_Config"/> <logger level="INFO" doc:name="Logger" doc:id="log-success" message="PDF文件生成成功!"/> </flow> </mule>
这个DataWeave脚本会把JSON的键值对转换成一个HTML表格,然后PDF模块会把这个HTML渲染成标准的PDF文件,这样写出来的文件就能被阅读器正常打开了。
方案二:用Apache PDFBox自定义生成(适合复杂需求)
如果你的PDF格式需求比较复杂,比如需要自定义字体、排版,可以直接用Apache PDFBox这个Java库来实现:
- 第一步:添加依赖
在项目的pom.xml中加入PDFBox的依赖(选一个和Mule 4.2.1兼容的版本,比如2.0.24):
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version> </dependency>
- 第二步:用Java组件编写PDF生成逻辑
创建一个Java类,接收JSON数据,用PDFBox生成PDF并返回二进制流,然后在Flow中调用这个Java组件,最后把二进制流写入文件。
最后再提醒一下
别再直接把JSON文本存成.pdf文件啦!必须先把JSON数据转换成符合PDF规范的二进制内容,才能生成能正常打开的PDF文件。
内容的提问来源于stack exchange,提问作者Devendra
相关产品推荐
相关产品推荐

