You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无需写入磁盘:将Base64编码PDF转换为FileInputStream

直接将Base64编码PDF转为PDFBOX可用的内存流(无需写入磁盘)

嘿,完全懂你不想多做一次磁盘IO的想法——绕磁盘那一步纯纯是没必要的开销!其实你根本不需要生成FileInputStream,PDFBOX的API本身就支持直接读取内存中的输入流,咱们直接用ByteArrayInputStream就能搞定,全程在内存里处理,效率高多了。

具体步骤:

  • 第一步:解码Base64字符串为字节数组:用Java自带的Base64工具类解码客户端传来的Base64编码内容。如果你的Base64字符串带了MIME前缀(比如data:application/pdf;base64,),记得先把前缀去掉再解码。
  • 第二步:将字节数组转为内存输入流:把解码后的字节数组包装成ByteArrayInputStream,这是一个完全在内存中运行的输入流,不需要依赖磁盘文件。
  • 第三步:直接用PDFBOX加载这个流:PDFBOX的PDDocument.load()方法接受所有InputStream子类,ByteArrayInputStream完全符合要求,直接传入即可开始处理PDF。

完整代码示例:

import org.apache.pdfbox.pdmodel.PDDocument;
import java.io.ByteArrayInputStream;
import java.util.Base64;

public class Base64PdfProcessor {
    public static void main(String[] args) {
        // 模拟从客户端获取的Base64编码PDF(如果有前缀,先处理掉)
        String base64EncodedPdf = "这里替换成你的Base64编码内容";
        
        // 处理带前缀的情况(可选,根据实际输入调整)
        if (base64EncodedPdf.startsWith("data:application/pdf;base64,")) {
            base64EncodedPdf = base64EncodedPdf.split(",")[1];
        }

        try {
            // 解码Base64为字节数组
            byte[] pdfByteArray = Base64.getDecoder().decode(base64EncodedPdf);
            // 转为内存输入流
            ByteArrayInputStream inputStream = new ByteArrayInputStream(pdfByteArray);
            
            // 直接用PDFBOX加载流,处理PDF
            try (PDDocument document = PDDocument.load(inputStream)) {
                // 示例:获取PDF页数
                System.out.println("PDF总页数:" + document.getNumberOfPages());
                // 这里写你的业务逻辑,比如提取文本、修改内容等
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

为什么不用FileInputStream?

FileInputStream是专门用于读取磁盘文件的流,而我们的场景是从Base64直接转成内存数据,用ByteArrayInputStream不仅完全满足PDFBOX的要求,还避免了磁盘写入和读取的IO操作,性能提升非常明显,尤其在处理大量PDF的时候优势更大。

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

火山引擎 最新活动