在应用程序中通过处理字节串(bytes)和字节数组(bytearray)来操作 PDF 文档是一种高效且灵活的方式。通过直接将 PDF 作为字节流处理,开发者可以在内存中管理文档或通过网络传输,而无需临时文件存储,从而优化空间并提高应用程序的整体性能。这种方法还可以与 Web 服务和 API 无缝集成。此外,使用字节数组(bytearray)还允许开发者对 PDF 文档进行精确的字节级修改。
本文将演示如何使用 Spire.PDF for Python 通过 Python 代码将 PDF 文档保存为字节串和字节数组,以及从字节串和字节数组中加载 PDF 文档。
安装 Spire.PDF for Python
本教程需要用到 Spire.PDF for Python 和 plum-dispatch v1.7.4。可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.PDF
如果您不确定如何安装,请参考:如何在 Windows 中安装 Spire.PDF for Python
创建 PDF 文档并保存为字节串和字节数组
开发者可以使用 Spire.PDF for Python 提供的类和方法创建 PDF 文档,保存到 Stream 对象,然后将其转换为不可变的字节串对象(bytes)或可变的字节数组对象(bytearray)。Stream 对象也可用于执行字节级操作。详细步骤如下:
- 创建 PdfDocument 类的对象以创建 PDF 文档。
- 向文档添加页面,并在页面上绘制文本。
- 使用 PdfDocument.SaveToStream() 方法将文档保存到 Stream 对象。
- 使用 Stream.ToArray() 方法将 Stream 对象转换为字节串对象。
- 使用 bytes 对象初始化一个 bytearray 对象。
- 之后,可以使用字节流进行进一步操作,例如使用 BinaryIO.write() 方法将其写入文件。
- Python
from spire.pdf import *
# 创建PdfDocument类的实例
pdf = PdfDocument()
# 设置文档的页面尺寸和页边距
pageSettings = pdf.PageSettings
pageSettings.Size = PdfPageSize.A4()
pageSettings.Margins.Top = 50
pageSettings.Margins.Bottom = 50
pageSettings.Margins.Left = 40
pageSettings.Margins.Right = 40
# 向文档添加新页面
page = pdf.Pages.Add()
# 为文档内容创建字体和画刷
titleFont = PdfTrueTypeFont("HarmonyOS Sans SC", 16.0, PdfFontStyle.Bold, True)
titleBrush = PdfBrushes.get_Brown()
contentFont = PdfTrueTypeFont("HarmonyOS Sans SC", 13.0, PdfFontStyle.Regular, True)
contentBrush = PdfBrushes.get_Black()
# 在页面上绘制标题
titleText = "云计算简要介绍"
titleSize = titleFont.MeasureString(titleText)
page.Canvas.DrawString(titleText, titleFont, titleBrush, PointF(0.0, 30.0))
# 在页面上绘制正文文本
contentText = ("云计算是一种服务模式,计算资源通过互联网按需提供。"
"它是一种基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)模型。"
"云计算通常以订阅制的方式提供,用户按月、按年或其他方式为云资源的使用付费。")
# 设置正文文本的字符串格式
contentFormat = PdfStringFormat()
contentFormat.Alignment = PdfTextAlignment.Justify # 文本对齐方式为两端对齐
contentFormat.LineSpacing = 20.0 # 设置行间距
# 创建TextWidget对象,并应用字符串格式
textWidget = PdfTextWidget(contentText, contentFont, contentBrush)
textWidget.StringFormat = contentFormat
# 创建TextLayout对象并设置布局选项
textLayout = PdfTextLayout()
textLayout.Layout = PdfLayoutType.Paginate # 设置分页布局
textLayout.Break = PdfLayoutBreakType.FitPage # 设置适合页面的换页模式
# 在页面上绘制TextWidget
rect = RectangleF(PointF(0.0, titleSize.Height + 50.0), page.Canvas.ClientSize)
textWidget.Draw(page, rect, textLayout)
# 将PDF文档保存到Stream对象
pdfStream = Stream()
pdf.SaveToStream(pdfStream)
# 将Stream对象转换为字节串(bytes)对象
pdfBytes = pdfStream.ToArray()
# 将Stream对象转换为字节数组(bytearray)对象
pdfBytearray = bytearray(pdfStream.ToArray())
# 将字节串对象和字节数组对象写入文件
with open("output/PDFBytes.pdf", "wb") as f:
f.write(pdfBytes)
with open("output/PDFBytearray.pdf", "wb") as f:
f.write(pdfBytearray)
从字节流中加载 PDF 文档
开发者可以使用 PDF 文件的字节串创建 Stream 对象,并通过 PdfDocument.LoadFromStream() 方法将其加载为 PDF 文档,从而对文档执行各种操作,如读取、修改和转换等。以下是步骤示例:
- 使用 PDF 文件创建一个字节串对象。
- 使用字节串创建 Stream 对象。
- 使用 PdfDocument.LoadFromStream() 方法将 Stream 对象加载为 PDF 文档。
- 提取文档第一页的文本并打印输出。
- Python
from spire.pdf import *
# 从PDF文件创建字节数组
with open("示例.pdf", "rb") as f:
byteData = f.read()
# 从字节数组创建Stream对象
stream = Stream(byteData)
# 将Stream对象加载为PDF文档
pdf = PdfDocument(stream)
# 获取第一页的文本
page = pdf.Pages.get_Item(0)
textExtractor = PdfTextExtractor(page)
extractOptions = PdfTextExtractOptions()
extractOptions.IsExtractAllText = True # 设置为提取所有文本
text = textExtractor.ExtractText(extractOptions)
# 输出提取的文本
print(text)
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。