错误:使用 mule 4 将多个 pdf 合并为单个 pdf 时获取空白 PDF

问题描述 投票:0回答:1

就我而言,我将收到多个 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&#10;output application/json&#10;---&#10;{"Content-Type": "application/pdf",&#10;&#10;"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>

目前的回应: enter image description here

预期响应:使用 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 文件合并为一个文件。如何克服这种逻辑的空白反应?

请高手帮我解答一下这个逻辑。

提前致谢。

java mulesoft mule4
1个回答
0
投票

我看到两个问题:

  1. 当 PDF 是二进制文件时,您将它们作为字符串传递。这是输入文件损坏的原因。二进制在 Java 中表示为字节数组 (

    byte[]
    ),而不是字符串。

  2. 看起来您正在尝试将响应强制发送到 HTTP 附件中。 Mule 4 对附件使用特定的输出格式:multipart/form-data。在尝试真正的多部分输出之前,我建议将 PDF 输出为响应正文而不是附件,以验证结果。您需要覆盖的唯一标头是

    Content-Type
    。另外,如果您要为标头设置变量,请使用
    output application/java
    而不是 JSON。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.