就我而言,我将收到多个 pdf 文件作为 API 请求。我正在使用 org.apache.pdfbox 库来实现 PDF 文件合并并作为响应发回,我将 outboundHeaders 值设置为 http 侦听器中的标头。
Java代码:
package com.mule.api;
import org.apache.pdfbox.multipdf.PDFMergerUtility;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.LinkedHashMap;
public class MergePdfFile {
public static byte[] mergePdfs(String[] pdfs) throws IOException {
PDFMergerUtility pdfMerger = new PDFMergerUtility();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
for (String pdf : pdfs) {
pdfMerger.addSource(new ByteArrayInputStream(pdf.getBytes()));
}
pdfMerger.setDestinationStream(outputStream);
pdfMerger.mergeDocuments(null);
return outputStream.toByteArray();
}
}
我的骡子流:
<?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:java="http://www.mulesoft.org/schema/mule/java"
xmlns:http="http://www.mulesoft.org/schema/mule/http"
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/java http://www.mulesoft.org/schema/mule/java/current/mule-java.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:listener-config name="HTTP_Listener_config"
doc:name="HTTP Listener config"
doc:id="fc1b2c70-85ea-49dc-a39b-5f0dbcfe4719">
<http:listener-connection host="0.0.0.0"
port="8081" />
</http:listener-config>
<flow name="merge-pdf-apiFlow" doc:id="12b9d7c1-223e-477c-a20c-1d0081906033" >
<http:listener doc:name="Listener" doc:id="b2f2f671-31b0-47e4-8f6c-545f7ac198e4" config-ref="HTTP_Listener_config" path="/mergepdf">
<http:response >
<http:headers ><![CDATA[#[vars.outboundHeaders default {}]]]></http:headers>
</http:response>
</http:listener>
<logger level="INFO" doc:name="Initial Logger" doc:id="1f915939-7024-4e98-9aee-d932b9f64188" message="Initial stage || Merge multiple file API is invoked"/>
<java:invoke-static doc:name="Invoke static" doc:id="82ed866b-f691-4233-b78a-ab45ddf39aec" class="com.mule.api.MergePdfFile" method="mergePdfs(java.lang.String[])">
<java:args ><![CDATA[#[{
pdfs: payload.parts..content
}]]]></java:args>
</java:invoke-static>
<set-variable value='#[%dw 2.0 output application/json --- {"Content-Type": "application/pdf", "Content-Disposition": "attachment; filename=someName.pdf"}]' doc:name="Set outboundHeaders" doc:id="627d65cb-3fdd-4b79-8d9a-419b5f308a38" variableName="outboundHeaders" />
<logger level="INFO" doc:name="Final Logger" doc:id="b9f8a7dc-9f52-4f3f-b2c1-7a194cbf3886" message="Java executed success || File Merged Successfully"/>
</flow>
</mule>
预期响应:使用 mule 4 将这些文件合并为单个 PDF 文件。
PDF 文件示例:
PDF 文件 1:https://freetestdata.com/wp-content/uploads/2021/09/Free_Test_Data_100KB_PDF.pdf
PDF 文件 2:https://freetestdata.com/wp-content/uploads/2023/07/260KB.pdf
请帮我将多个 pdf 文件合并为一个文件。如何克服这种逻辑的空白反应?
请高手帮我解答一下这个逻辑。
提前致谢。
我看到两个问题:
当 PDF 是二进制文件时,您将它们作为字符串传递。这是输入文件损坏的原因。二进制在 Java 中表示为字节数组 (
byte[]
),而不是字符串。
看起来您正在尝试将响应强制发送到 HTTP 附件中。 Mule 4 对附件使用特定的输出格式:multipart/form-data。在尝试真正的多部分输出之前,我建议将 PDF 输出为响应正文而不是附件,以验证结果。您需要覆盖的唯一标头是
Content-Type
。另外,如果您要为标头设置变量,请使用 output application/java
而不是 JSON。