在现代 Java 应用中,PDF 数据并不总是以文件形式存储在磁盘上。它可能通过网络传输、由 REST API 返回,或以字节数组形式存储在数据库中。这类场景中,我们经常需要将字节数组还原为 PDF 文件,甚至需要从纯文本字节生成新的 PDF 文档。
本教程将介绍如何使用 Spire.PDF for Java 在 Java 中将字节(Byte)数组转换为PDF文档 。
目录:
Spire.PDF for Java 入门指南
Spire.PDF 是一款功能强大的 API,为 Java 开发者提供无需依赖 Adobe Acrobat 即可创建、读取、编辑、转换和打印 PDF 文档的能力。
核心功能:
- 生成包含文本、图片、表格和形状的 PDF 文档。
- 编辑现有 PDF 并支持文本与图像提取。
- 将 PDF 转换为 HTML、Word、Excel 及图像等多种格式。
- 通过密码保护实现 PDF 加密。
- 添加水印、注释及数字签名。
安装:
请从官方网站下载 Spire.PDF for Java,并将 JAR 文件添加到项目的构建路径中。若使用 Maven 项目管理工具,请在 pom.xml 文件中配置以下依赖项:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>11.8.3</version>
</dependency>
</dependencies>
环境配置完成后,即可开始执行字节数组转 PDF 及其他 PDF 相关操作。
解析 PDF 字节与文本字节的区别
在编写代码前,需要明确区分两种截然不同的字节数组类型:
- PDF 文件字节 :代表有效 PDF 文档的实际二进制结构。这类字节始终以 %PDF-1.x 开头,包含对象、交叉引用表和流数据。此类字节数组可直接加载到 PdfDocument 对象中。
- 文本字节 :仅仅是字符的 ASCII 或 UTF-8 编码。例如:
byte[] bytes = {-26, -83, -92};
System.out.println(new String(bytes, java.nio.charset.StandardCharsets.UTF_8)); // 输出结果:"此"
这类数组并非有效的 PDF 数据,但可以通过创建新 PDF 文档并将文本内容写入其中来实现转换。
Java 从字节数组加载 PDF 文档
假设你想从 URL 下载一个 PDF,并将其作为字节数组在内存中处理。使用 Spire.PDF for Java,你可以轻松加载并将其保存为 PDF 文档。
import com.spire.pdf.PdfDocument;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class LoadPdfFromByteArray throws Exception {
public static void main(String[] args) {
// PDF URL
String fileUrl = "https://www.e-iceblue.com/resource/sample_pdf_for_download.pdf";
// 将 PDF 下载为字节数组
byte[] pdfBytes = downloadPdfAsBytes(fileUrl);
// 创建 PdfDocument 对象
PdfDocument doc = new PdfDocument();
// 从字节数组加载 PDF
doc.loadFromStream(new ByteArrayInputStream(pdfBytes));
// 将文档保存到本地
doc.saveToFile("downloaded.pdf");
doc.close();
}
// 辅助方法:将文件下载为字节数组
private static byte[] downloadPdfAsBytes(String fileUrl) throws Exception {
URL url = new URL(fileUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
InputStream inputStream = conn.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] data = new byte[4096];
int nRead;
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
inputStream.close();
conn.disconnect();
return buffer.toByteArray();
}
}
工作原理:
- 发出 HTTP 请求以获取 PDF 文件。
- 使用 ByteArrayOutputStream 将 InputStream转换为字节数组。
- 通过 loadFromStream将字节数组传递给 Spire.PDF。
- 根据需要保存或处理文档。
效果图:
Java 基于文本字节创建 PDF 文档
如果你只有纯文本字节(例如:“此文档是由文本字节创建的。”),你可以将其解码为字符串,然后将文本绘制到新的 PDF 文档中。
import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import java.awt.*;
public class TextFromBytesToPdf {
public static void main(String[] args) {
// 你的文本字节
byte[] byteArray = {
-26, -83, -92, // 此
-26, -106, -121, // 文
-26, -95, -93, // 档
-26, -104, -81, // 是
-25, -108, -79, // 由
-26, -106, -121, // 文
-26, -100, -84, // 本
-27, -83, -105, // 字
-24, -118, -126, // 节
-27, -120, -101, // 创
-27, -69, -70, // 建
-25, -102, -124, // 的
-29, -128, -126 // 。
};
String text = new String(byteArray, java.nio.charset.StandardCharsets.UTF_8);
// 创建 PDF 文档
PdfDocument doc = new PdfDocument();
// 配置页面设置
doc.getPageSettings().setSize(PdfPageSize.A4);
doc.getPageSettings().setMargins(40f);
// 添加页面
PdfPageBase page = doc.getPages().add();
// 将字符串绘制到 PDF 上
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", 1, 16),true);
PdfSolidBrush brush = new PdfSolidBrush(new PdfRGBColor(Color.black));
page.getCanvas().drawString(text, font, brush, 20, 40);
// 将文档保存为 PDF 文件
doc.saveToFile("TextBytes.pdf");
doc.close();
}
}
这将生成一个名为 TextBytes.pdf 的新 PDF 文件(如下所示),其中包含你的字节数组所表示的文本。
您可能会感兴趣:如何在 Java 中生成 PDF 文档
常见误区与避免方法
将字节数组转换为 PDF 时,需注意以下问题:
- 混淆纯文本与PDF****字节流
并非所有字节数组都是有效的 PDF。除非数组以 %PDF-1.x 开头且包含完整结构体,否则无法直接使用PdfDocument.loadFromStream加载。
- 编码格式错误
若文本字节采用 UTF-16 、ISO-8859-1或其他编码,创建字符串时需指定字符集:
String text = new String(byteArray, StandardCharsets.UTF_8);
- 大体积字节数组处理
处理大型 PDF 时,建议采用流式传输而非完全加载到内存,避免 OutOfMemoryError异常。
- 遗漏文档关闭操作
保存或处理 PDF 后务必调用 doc.close() 来释放资源。
常见问题解答
Q1. 能否将 PDF 以字节数组形式存入数据库?
可以。您可以将 PDF 作为 BLOB 类型存储在关系型数据库中,后续可检索并加载到 PdfDocument对象中进行保存或编辑。
Q2. 如何验证字节数组是否为有效 PDF?
检测数组是否以 %PDF- 开头即可。示例代码:
String header = new String(Arrays.copyOfRange(bytes, 0, 5));
if (header.startsWith("%PDF-")) {
// 有效的PDF文件
}
Q3. Spire.PDF 能否直接从 InputStream 加载 PDF?
可以。无需转换为字节数组,可直接将 InputStream传递给 loadFromStream() 方法。
Q4. 能否将 PdfDocument 重新转换为字节数组?
可通过 ByteArrayOutputStream 保存文档:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
doc.saveToStream(baos);
byte[] pdfBytes = baos.toByteArray();
Q5. 若字节数组包含的是图像而非文本或 PDF 怎么办?
此情况下需要创建新 PDF 文档,并使用 Spire.PDF 的绘图 API 插入图像。
总结
本文探讨了如何通过 Spire.PDF for Java 实现字节数组与 PDF 文档的转换。无论您是通过 API 获取字节数组加载现有 PDF 文件,还是从纯文本字节创建新 PDF,Spire.PDF 都能提供可靠的解决方案。
我们重点解析了 PDF 文件字节与文本字节的本质区别,并指出转换过程中需要规避的常见误区。通过掌握这些核心概念和工具,您可以在 Java 应用中无缝集成字节数组到 PDF 的转换功能,提升文档数据的管理与处理能力。
申请临时License
如果您需要去除生成文档中的评估提示或解除功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。