You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PDFbox合并PDF后直接上传至AWS S3(无需本地存储)

解决方案:内存中合并PDF并直接上传至AWS S3

你完全可以通过内存流实现合并后直接上传,全程无需生成本地物理文件。核心思路是用ByteArrayOutputStream接收PDFBox合并后的内容,再转成ByteArrayInputStream传给AWS S3的上传API,让数据全程在内存中流转。

以下是修改后的完整可运行代码:

import org.apache.pdfbox.multipdf.PDFMergerUtility;
import org.apache.pdfbox.io.MemoryUsageSetting;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

public class PdfMergeAndUpload {
    public void mergeAndUploadToS3(File fileOne, File fileTwo, String bucketName, String s3FileName, S3Client s3Client) throws IOException {
        // 初始化PDF合并工具
        PDFMergerUtility pdfMergerUtility = new PDFMergerUtility();
        pdfMergerUtility.addSource(fileOne);
        pdfMergerUtility.addSource(fileTwo);

        // 使用内存流接收合并后的PDF内容,完全跳过本地文件
        try (ByteArrayOutputStream mergedOutputStream = new ByteArrayOutputStream()) {
            // 将合并结果写入内存输出流
            pdfMergerUtility.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly(), mergedOutputStream);

            // 把内存输出流转为输入流,适配S3的上传要求
            try (ByteArrayInputStream mergedInputStream = new ByteArrayInputStream(mergedOutputStream.toByteArray())) {
                // 配置S3上传请求,指定文件类型为PDF(确保S3能正确识别)
                PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                        .bucket(bucketName)
                        .key(s3FileName)
                        .contentType("application/pdf")
                        .build();

                // 直接上传至S3
                s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(mergedInputStream, mergedOutputStream.size()));
            }
        }
    }
}

关键修改点说明:

  • 移除本地文件依赖:不再调用setDestinationFileName(),彻底放弃本地文件输出逻辑。
  • 内存流中转数据:用ByteArrayOutputStream替代文件输出流,合并后的PDF数据直接存储在内存中。
  • 适配S3上传格式:将ByteArrayOutputStream转为ByteArrayInputStream,满足S3上传API对输入流的要求。
  • 设置文件元数据:通过contentType("application/pdf")告知S3文件类型,确保后续下载或预览时的正确处理。
  • 自动管理资源:使用try-with-resources语法,让JVM自动关闭所有流,避免内存泄漏和资源浪费。

额外提示:

如果合并的PDF文件体积较大,纯内存模式可能导致内存占用过高,这时可以考虑用MemoryUsageSetting.setupMixed()配置内存+临时文件的混合模式,但临时文件会生成在服务器上;若你完全不想有任何本地文件残留,保持setupMainMemoryOnly()即可。

内容的提问来源于stack exchange,提问作者Amara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:07:28