java 使用pdfbox分割pdf文件,返回 byte[]

业务需求上传一张有8张发票合起来的pdf格式的文件,现在要把8张发票都扫描出来,而腾讯云只支持一个个pdf格式扫描,这样需要把文件切割成8张pdf格式发票.
需要用到apache的pdfbox
在pom中加入

<dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox-app</artifactId>
            <version>1.8.10</version>
</dependency>

这个类可以切割pdf文件,相关代码
先把附件加载到PDDocument

PDDocument load = PDDocument.load(file.getInputStream());

然后用Splitter切割

Splitter splitter = new Splitter();
List<PDDocument> pages = splitter.split(load);

切割成功后,把数据循环

Iterator<PDDocument> iterator = pages.iterator();

完整代码

 PDDocument load = PDDocument.load(file.getInputStream());
Splitter splitter = new Splitter();
 List<PDDocument> pages = splitter.split(load);
 Iterator<PDDocument> iterator = pages.iterator();
 JSONArray resultDataList = new JSONArray();
 while (iterator.hasNext()) {
     PDDocument next = iterator.next();
     ByteArrayOutputStream output = new ByteArrayOutputStream();
     next.save(output);
     logger.info("byteArray: {}", output.toByteArray());
     param.put("imageBase64", base64Encoder.encode(output.toByteArray()));
     JSONObject jsonObject = sendCutAndSortRecognition(url_paas_billInfo, param, token);
     if(date.isEmpty()){
         date = jsonObject;
     }
     resultDataList.addAll(jsonObject.getJSONArray("resultDataList"));
 }

返回byte的代码,output.toByteArray()返回的就是byte[]

ByteArrayOutputStream output = new ByteArrayOutputStream();
next.save(output);
output.toByteArray()
<think>我们正在处理一个Spring Boot应用,需要解析包含PDF文件的Base64编码字符串。目标是将Base64字符串解码为PDF文件,并保存到服务器或进行进一步处理。 步骤: 1. 接收Base64编码的字符串(通常来自前端或其他服务)。 2. 将Base64字符串解码为字节数组。 3. 将字节数组写入为PDF文件,或者使用PDF解析库(如Apache PDFBox)直接解析内容。 注意:Base64编码的字符串可能包含前缀(如`data:application/pdf;base64,`),我们需要去除这些前缀,只保留纯Base64数据。 示例代码: 假设我们有一个Base64字符串,它可能包含前缀,也可能不包含。我们可以这样处理: ```java import org.apache.commons.codec.binary.Base64; import java.io.FileOutputStream; import java.io.IOException; public class Base64ToPdf { public static void decodeBase64ToPdf(String base64String, String outputFilePath) throws IOException { // 去除Base64字符串中可能包含的数据URI前缀 String base64Data = base64String.split(",")[1]; byte[] decodedBytes = Base64.decodeBase64(base64Data); try (FileOutputStream fos = new FileOutputStream(outputFilePath)) { fos.write(decodedBytes); } } } ``` 但是,如果Base64字符串不包含前缀,直接使用`base64String`即可。因此,我们可以先检查是否包含逗号,如果有则分割,否则直接使用。 改进版本: ```java public static void decodeBase64ToPdf(String base64String, String outputFilePath) throws IOException { String base64Data; if (base64String.contains(",")) { base64Data = base64String.split(",")[1]; } else { base64Data = base64String; } byte[] decodedBytes = Base64.decodeBase64(base64Data); try (FileOutputStream fos = new FileOutputStream(outputFilePath)) { fos.write(decodedBytes); } } ``` 在Spring Boot中,我们可能在一个Controller中接收Base64字符串,然后调用上述方法。 示例Controller方法: ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class PdfController { @PostMapping("/uploadPdf") public String uploadPdf(@RequestBody String base64String) { try { // 假设我们保存到项目的临时目录,实际应用中需要根据需求指定路径 String filePath = "temp.pdf"; decodeBase64ToPdf(base64String, filePath); return "PDF saved successfully!"; } catch (IOException e) { e.printStackTrace(); return "Error: " + e.getMessage(); } } } ``` 注意:上述代码使用了Apache Commons Codec库的Base64类。在Spring Boot项目中,我们可以添加依赖: Maven: ```xml <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.15</version> <!-- 使用最新版本 --> </dependency> ``` 或者,我们也可以使用Java 8自带的`java.util.Base64`: ```java import java.util.Base64; public static void decodeBase64ToPdf(String base64String, String outputFilePath) throws IOException { String base64Data; if (base64String.contains(",")) { base64Data = base64String.split(",")[1]; } else { base64Data = base64String; } byte[] decodedBytes = Base64.getDecoder().decode(base64Data); try (FileOutputStream fos = new FileOutputStream(outputFilePath)) { fos.write(decodedBytes); } } ``` 这样就不需要额外的依赖。 另外,如果我们需要在内存中处理PDF(例如解析内容),而不是保存为文件,我们可以使用PDF解析库(如PDFBox)来加载字节数组并解析。 使用PDFBox解析的示例: 添加依赖(Maven): ```xml <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version> <!-- 使用最新版本 --> </dependency> ``` 解析代码: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import java.io.ByteArrayInputStream; import java.io.IOException; public static String parsePdf(byte[] pdfBytes) throws IOException { try (PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes))) { PDFTextStripper stripper = new PDFTextStripper(); return stripper.getText(document); } } ``` 然后,我们可以在解码后直接调用这个方法获取文本内容。 总结: 1. 解码Base64字符串为字节数组(注意处理可能的前缀)。 2. 可以选择将字节数组保存为PDF文件,或者使用PDF解析库解析内容。 根据实际需求选择保存文件还是直接解析。 注意:处理文件时要注意异常处理,确保资源被正确关闭。 在Spring Boot应用中,我们通常会将文件保存到指定的存储位置(如文件系统、云存储等),或者将解析的内容存储到数据库。这里我们提供了基本的解码和保存方法。 如果Base64字符串很大,我们还需要考虑内存使用情况,可以使用流式处理,但Base64解码通常需要整个字符串,所以对于大文件需要确保有足够的内存。 另外,如果Base64字符串来自前端,通常是通过表单数据(multipart/form-data)或JSON传递。在Controller中,我们可以使用一个包含Base64字符串的DTO来接收。 例如: ```java public class PdfUploadRequest { private String base64Pdf; // getter and setter } @PostMapping("/uploadPdf") public String uploadPdf(@RequestBody PdfUploadRequest request) { // 使用request.getBase64Pdf() } ``` 这样更符合RESTful风格。 以上就是在Spring Boot应用中解析Base64编码的PDF文件的基本方法。</think>在Spring Boot应用中解析Base64编码的PDF文件,需要经过以下步骤: ### 解决方案步骤 1. **接收Base64字符串** 从请求中获取包含PDF数据的Base64字符串(可能包含前缀如`data:application/pdf;base64,`)。 2. **清理和验证数据** ```java public static String cleanBase64(String base64Str) { if (base64Str.contains(",")) { return base64Str.split(",")[1]; // 移除数据URI前缀 } return base64Str; } ``` 3. **解码为字节数组** 使用Java 8+内置的Base64解码器: ```java import java.util.Base64; byte[] pdfBytes = Base64.getDecoder().decode(cleanBase64(base64String)); ``` 4. **保存为PDF文件** ```java import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; Path path = Paths.get("output.pdf"); Files.write(path, pdfBytes); // 写入本地文件 ``` 5. **解析PDF内容(可选)** 使用Apache PDFBox解析文本: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; try (PDDocument doc = PDDocument.load(pdfBytes)) { String text = new PDFTextStripper().getText(doc); System.out.println("PDF内容:" + text); } ``` ### 完整Controller示例 ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.Base64; import java.nio.file.*; @RestController public class PdfController { @PostMapping("/decode-pdf") public String decodePdf(@RequestBody String base64Str) { try { // 1. 清理Base64字符串 String cleanBase64 = cleanBase64(base64Str); // 2. 解码为字节数组 byte[] pdfBytes = Base64.getDecoder().decode(cleanBase64); // 3. 保存文件 Path path = Paths.get("decoded.pdf"); Files.write(path, pdfBytes); return "PDF保存成功: " + path.toAbsolutePath(); } catch (Exception e) { return "解析失败: " + e.getMessage(); } } private String cleanBase64(String base64Str) { return base64Str.contains(",") ? base64Str.split(",")[1] : base64Str; } } ``` ### 依赖配置 在`pom.xml`中添加: ```xml <!-- Spring Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- PDF解析(可选) --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>3.0.0</version> </dependency> ``` ### 测试请求示例 使用Postman发送JSON请求: ```json { "base64Str": "data:application/pdf;base64,JVBERi0xLjQKJdP0zOUK..." } ``` ### 注意事项 1. **内存管理** 大文件使用流式处理,避免内存溢出: ```java InputStream stream = new ByteArrayInputStream(pdfBytes); ``` 2. **安全验证** - 检查Base64有效性:`base64Str.matches("[A-Za-z0-9+/=]+")` - 限制文件大小(通过`application.properties`): ``` spring.servlet.multipart.max-file-size=10MB ``` 3. **文件存储** 建议使用云存储(如AWS S3)替代本地文件系统 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值