使用Python通过字节串或字节数组加载和保存PDF文档

news2025/1/11 20:41:29

处理PDF文件的可以直接读取和写入文件系统中的PDF文件,然而,通过字节串(byte string)或字节数组(byte array)来加载和保存PDF文档在某些情况下更高效。这种方法不仅可以提高数据处理的灵活性,允许开发者在内存中直接操作PDF,而且还能增强安全性,同时方便跨应用传输和网络传输。
本文将介绍如何使用Python通过字节串或字节数组来加载和保存PDF文档

文章目录

    • 创建PDF文档并保存为字节串或字节数组
    • 从字节串或字节数组加载PDF文档进行操作

本文所使用的方法需要用到Spire.PDF for Python,PyPI:pip install Spire.PDF

创建PDF文档并保存为字节串或字节数组

我们可以使用库中的类和方法直接创建PDF文档,并将其保存到Stream对象。此对象可通过Stream.ToArray()方法转换为不可变的bytes对象进行操作。而bytes对象也可以直接转换为可变的bytearray对象,从而对文件进行字节层面的编辑或其他操作。以下是操作步骤:

  1. 导入所需模块。
  2. 创建PdfDocument对象。
  3. 设置PDF页面,添加页面并绘制内容。
  4. 使用PdfDocument.SaveToStream()方法将PDF文档保存到Stream对象。
  5. 使用Stream.ToArray()方法将Stream对象转换为bytes对象。
  6. 可使用bytes对象直接构建bytearray对象。
  7. 接下来可以字节串或字节数组进行更多操作,如写入文件、传输等。

代码示例

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 = ("人工智能(AI)是计算机科学的一个分支,它旨在创造能够模拟人类智能行为的机器。这包括学习(通过经验改进自身)、推理(使用规则来达到近似或确定性的结论)、自我修正等特性。AI的应用范围广泛,从简单的任务自动化到复杂的决策支持系统均有涉及。")
# 设置正文文本的格式
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/AI简介.pdf", "wb") as f:
    f.write(pdfBytearray)

结果
Python创建PDF文档并保存为字节

从字节串或字节数组加载PDF文档进行操作

Stream类支持用bytes对象(或bytearray直接转换为bytes)直接构建实例。然后,我们可以使用PdfDocument.LoadFromStream()方法将Stream对象载入为PDF文档进行文档操作,如编辑、转换等。以下是操作步骤:

  1. 导入所需模块。
  2. 创建bytes对象或使用现有bytes对象,来构建Stream对象。
  3. 创建PdfDocument对象。
  4. 使用PdfDocument.LoadFromStream()方法将Stream对象载入为PDF文档。
  5. 对文档进行操作,如提取页面文字。

代码示例

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)

结果
Python从字节载入PDF文档进行操作

本文演示了如何使用Python通过字节串或字节数组加载或保存PDF文档。

更多PDF文档操作技巧请前往Spire.PDF for Python教程查看。

申请免费License

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql8客户端连接异常:Public Key Retrieval is not allowed

mysql 8.0 默认使用 caching_sha2_password 身份验证机制 (即从原来mysql_native_password 更改为 caching_sha2_password。) 从 5.7 升级 8.0 版本的不会改变现有用户的身份验证方法,但新用户会默认使用新的 caching_sha2_password 。 客户…

ISO26262和Aspice之间的关联

ASPICE 介绍: ASPICE(Automotive Software Process Improvement and Capability dEtermination)是汽车软件过程改进及能力评定的模型,它侧重于汽车软件的开发过程。ASPICE 定义了一系列的过程和活动,包括需求管理、软…

基于yolov8的抽烟检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的抽烟检测系统是一种利用先进深度学习技术实现的实时目标检测系统。该系统采用YOLOv8算法,该算法以其高速度和高精度在目标检测领域脱颖而出。该系统通过训练大量标注好的抽烟行为数据集,使模型能够自动识别和定位视频或图像中…

使用YOLOv10训练自定义数据集之二(数据集准备)

0x00 前言 经过上一篇环境部署的介绍【传送门】,我们已经得到了一个基本可用的YOLOv10的运行环境,还需要我们再准备一些数据,用于模型训练。 0x01 准备数据集 1. 图像标注工具 数据集是训练模型基础素材。 对于小白来说,一般…

如何判断小程序是运行在“企业微信”中的还是运行在“微信”中的?

如何判断小程序是运行在“企业微信”中的还是运行在“微信”中的? 目录 如何判断小程序是运行在“企业微信”中的还是运行在“微信”中的? 一、官方开发文档 1.1、“微信小程序”开发文档的说明 1.2、“企业微信小程序”开发文档的说明 1.3、在企业…

redis缓存预热、缓存穿透的详细教程

前言 作此篇主要在于关于redis的缓存预热、缓存雪崩、缓存击穿和缓存穿透在面试中经常遇到,工作中也是经常遇到。中级程序员基本上不可避免要克服的几个问题,希望一次性解释清楚 缓存预热 MySQL加入新增100条记录,一般默认以MySQL为准为底单…

5-2 检测内存容量

1 使用的是bios 中断, 每次进行检测都会返回一块 内容。并且标志上,这块内存是否可用。 接下来是代码: 首先是构建 一个文件夹, 两个文件。 types.h 的内容。 #ifndef TYPES_H #define TYPES_H// 基本整数类型,下面的…

C++系统教程002-数据类型(01)

一、数据类型 学习一门编程语言,首先要掌握它的数据类型。不同的数据类型占用的内存空间不同,定义数据类型合理在一定程度上可以优化程序的运行。本次主要介绍C中常见的数据类型及数据的输入与输出格式。本章知识架构及重难点如下: &#xf…

linux监听网速

方法一 tcpdump -i ens33 -w - | pv -bert > /dev/null方法二

问题 J: 数据结构基础33-查找二叉树

题目描述 已知一棵二叉树用邻接表结构存储&#xff0c;中序查找二叉树中值为x的结点&#xff0c;并指出是第几个结点。例&#xff1a;如图二叉树的数据文件的数据格式如下 输入 第一行n为二叉树的结点个树&#xff0c;n<100&#xff1b;第二行x表示要查找的结点的值&…

windows环境安装OceanBase数据库并创建表、插入数据

windows环境安装OceanBase数据库并创建表、插入数据 前言&#xff1a;OceanBase数据库目前不支持直接在Windows环境下安装&#xff0c;安装比较麻烦&#xff0c;记录一下安装过程 1.安装方案 根据官方文档&#xff1a;https://www.oceanbase.com/docs/common-oceanbase-databa…

实验六 异常处理

实验目的及要求 目的&#xff1a;了解异常的概念&#xff0c;掌握异常处理的方法&#xff0c;掌握throws与throw关键字的区别与联系&#xff0c;掌握自定义异常的方法及用途。 要求&#xff1a; &#xff08;1&#xff09;编写程序了解程序中可能出现的运行时异常与非运行时…

摆花 NOIP2012普及组

目录 思路 代码 思路 代码 #include <iostream> #include <algorithm>using namespace std; using LL long long;const int N 1e2 9; const int mod 1e6 7;int n,m; LL a[N]; LL f[N][N];void solve() {cin >> n >> m;f[0][0] 1;for (int i 1;…

Jmeter模拟用户登录时获取token如何跨线程使用?

一、用户定义的变量 1、添加"用户定义的变量" 2、填写"host、port" 二、setUp线程组 1、添加"setUp线程组" 2、设置循环次数"100" 三、CSV 数据文件设置 1、添加"CSV 数据文件设置" 2、填写信息"用户登录数据.csv、…

2024 天池云原生编程挑战赛决赛名单公布,9 月 20 日开启终极答辩

历时 4 个月&#xff0c;2024 天池云原生编程挑战赛决赛名单公布&#xff01; 本届大赛规模创新高&#xff0c;参赛战队达 20000 支&#xff0c; 广覆盖国内外优秀高校和杰出企业&#xff01;吸引了来自北京大学、清华大学等 176 所国内外优秀高校&#xff0c;以及美团、米哈游…

vue3+ts项目import导入路径用@/报错找不到模块“@/components/也没有快捷提示

解决办法 在tsconfig.json文件中加入以下代码 "compilerOptions": {"baseUrl": ".","paths": {"/*": ["./src/*"] }}, 喏 ☟

【开端】服务器间免密登录配置

1.首先进入源 服务器中&#xff0c;进入/root/.ssh路径下 2.将路径下的”id_rsa.pub”文件复制到目标服务器的/root/.ssh路径下 3.打开目标服务器/root/.ssh路径中的“authorized_keys”文件&#xff0c;如没有则创建&#xff0c;并将”id_rsa.pub”文件中的内容复制到“auth…

ctfshow-爆破(web21-web28)

web21 提交用户和密码后发现没有用户以及密码的值呢 常见的是在post数据中 或者url后传值 但这里都没有 发现http头有一个Authorization字段 值是base64编码后的 解码 原来是将传入的值用冒号分离进行base64编码然后放到了Authorization字段中了 设置变量 增加前缀 增加编码方…

Spring6梳理6——依赖注入之Setter注入

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 一、引言 二、Java方法初始化过程 2.1 set方法及构造器方法实现Book对象初始化 三…

深入浅出SRS—RTMP实现

RTMP 直播是 SRS 最典型的使用场景&#xff0c;客户端使用 RTMP 协议向 SRS 推流&#xff0c;使用 RTMP 协议从 SRS 拉流&#xff0c;SRS 作为一个 RTMP 直播服务器实现媒体的转发。同时&#xff0c;RTMP 是 SRS 的中转协议&#xff0c;其他协议之间的互通需要先转为 RTMP&…