如何使用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
相关产品推荐
相关产品推荐

