如何使用Python 操作PDF?总结用Python操作PDF的几种方法

2023-11-11

本篇文章小编给大家分享一个用python来操作pdf图像的几种方法,如果有需求的小伙伴一定要耐心阅读完这篇文章,小编希望能够通过这篇文章来给大家的学习带来一定的帮助。

Python操作PDF有以下几种方法:

(1)基本操作

PyPDF2 导入模块的代码常常是:

from PyPDF2 import PdfFileReader, PdfFileWriter

这里导入了两个方法:

PdfFileReader 可以理解为读取器

PdfFileWriter 可以理解为写入器

接下来通过几个案例进一步认识这两个工具的奇妙之处,用到的示例文件是5个发票的 pdf

每个发票的 PDF 都由两页组成:

(2)合并

第一个工作是将5个发票pdf合并成10页。这里读取器和写入器应该怎么配合呢?

逻辑如下:

读取器将所有pdf读取一遍

读取器将读取的内容交给写入器

写入器统一输出到一个新pdf

这里还有一个重要的知识点:读取器只能将读取的内容一页一页交给写入器。

因此,逻辑中第1步和第2步实际上不是彼此独立的步骤,而是读取器读取完一个pdf后,就将这个pdf全部页循环一遍,挨页交给写入器。**后等读取工作全部结束后再输出。

看一下代码可以让思路更清楚:

from PyPDF2 import PdfFileReader, PdfFileWriter
path = r'C:Usersxxxxxx'
pdf_writer = PdfFileWriter()
for i in range(1, 6):
    pdf_reader = PdfFileReader(path + '/INV{}.pdf'.format(i))
    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))
with open(path + r'合并PDFmerge.pdf', 'wb') as out:
    pdf_writer.write(out)

由于全部内容都需要交给同一个写入器最后一起输出,所以写入器的初始化一定是在循环体之外的.

如果在循环体内则会变成每次访问读取一个pdf就生成一个新的写入器,这样每一个读取器交给写入器的内容就会被反复覆盖,无法实现我们的合并需求!

循环体开头的代码:

for i in range(1, 6):
    pdf_reader = PdfFileReader(path + '/INV{}.pdf'.format(i))

目的就是每次循环读取一个新的pdf文件交给读取器进行后续操作。实际上这种写法不是很提倡,由于各 pdf 命名恰好很规则,所以可以直接人为指定数字进行循环。更好的方法是用 glob 模块:

import glob
for file in glob.glob(path + '/*.pdf'):
    pdf_reader = PdfFileReader(path)

代码中 pdf_reader.getNumPages(): 能够获取读取器的页数,配合 range 就能遍历读取器的所有页。

pdf_writer.addPage(pdf_reader.getPage(page)) 能够将当前页交给写入器。

最后,用 with 新建一个 pdf 并由写入器的 pdf_writer.write(out) 方法输出即可。

(3)拆分

如果明白了合并操作中读取器和写入器的配合,那么拆分就很好理解了,这里我们以拆分 INV1.pdf 为2个单独的 pdf 文档为例,同样也先来捋一捋逻辑:

读取器读取 PDF 文档

读取器一页一页交给写入器

写入器每获取一页就立即输出

通过这个代码逻辑我们也可以明白,写入器初始化和输出的位置一定都在读取 PDF 循环每一页的循环体内,而不是在循环体外

代码很简单:

from PyPDF2 import PdfFileReader, PdfFileWriter
path = r'C:Usersxxx'
pdf_reader = PdfFileReader(path + 'INV1.pdf')
for page in range(pdf_reader.getNumPages()):
    # 遍历到每一页挨个生成写入器
    pdf_writer = PdfFileWriter()
    pdf_writer.addPage(pdf_reader.getPage(page))
    # 写入器被添加一页后立即输出产生pdf
    with open(path + 'INV1-{}.pdf'.format(page + 1), 'wb') as out:
        pdf_writer.write(out)

(4)水印

本次的工作是将下图作为水印添加到 INV1.pdf 中

首先是准备工作,将需要作为水印的图片插入 word 中调整合适位置后保存为PDF文件。然后就可以码代码了,需要额外用到 copy 模块。

就是把读取器和写入器初始化,并且把水印 PDF 页先读取好备用,核心代码稍微比较难理解:

加水印本质上就是把水印 PDF 页和需要加水印的每一页都合并一遍

由于需要加水印的 PDF 可能有很多页,而水印 PDF 只有一页,因此如果直接把水印 PDF 拿来合并,可以抽象理解成加完第一页,水印 PDF 页就没有了。

以上就是小编给大家带来的Python操作PDF的几种方法,希望大家通过阅读小编的文章之后能够有所收获!如果大家觉得小编的文章不错的话,可以多多分享给有需要的人。

如果你也喜欢编程,想通过学习Python获取更高薪资,这里给大家分享一份Python学习资料。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Python 操作PDF?总结用Python操作PDF的几种方法 的相关文章

  • 使用 PHP/linux 将文件合并为单个 PDF

    我正在研究如何将多个 PDF 合并为一个 PDF 我正在寻找一个图书馆可靠且坚固尽可能 最好有一个库可以保留书签 鬼脚本 http pages cs wisc edu ghost 可以在保存书签的位置进行连接 但我遇到了麻烦 在一种情况下它
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 如何从 R 读取 PDF 元数据

    我们很好奇 有没有一种方法可以从 R 读取 PDF 元数据 例如下面显示的信息 通过搜索我对此无能为力 r pdf metadata在当前的问题库中 非常欢迎任何指点 我想不出纯 R 的方法来执行此操作 但您可能可以安装您最喜欢的 PDF
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • USB 上的 Autorun.inf 可以让它运行 pdf 吗?

    我在网上做了一些研究 我想我只是在寻找构象 由于 Microsoft 如何在 Vista 及更高版本中对自动运行设置安全性 从 USB 自动运行不再起作用 正确的 看起来它仍然会显示运行 exe 的选项 但由于某些奇怪的原因我无法让它运行
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我

随机推荐

  • 开源进展

    作为连接实体对象 人或物 的现实身份与链上身份的可信映射 实现实体对象之间安全可信的数据授权与交换 分布式身份技术解决方案在推动区块链应用繁荣及可信数据流转的过程中扮演着重要角色 WeIdentity是一套实体身份认证及可信数据交换技术解决
  • Python3.7 安装pandas库

    pandas库 提供高性能易用数据类型和分析工具 原本使用pip install pandas语句安装即可 但是发现下载安装的速度太过缓慢 于是选择在官网下载 官网下载链接 https pypi org project pandas fil
  • python调用接口运行显示No tests were found 的解决方法

    python调用接口运行显示No tests were found 的解决方法 可能是python安装了pytest第三方包 而运行文件是以test开头命名的 可以选择修改文件名 不要以test开头 或者卸载pytest即可
  • C++从0到1(4):选择结构

    C 支持的三种程序运行结构 顺序结构 程序按顺序执行 不发生跳转 选择结构 依据条件是否满足 有选择的执行相应功能 循环结构 依据条件是否满足 循环多次执行某段代码 选择结构 1 if语句 include
  • 关于OLED移植出现Symbol oled_pow multiply defined

    问题 今天督促队友写代码 他反馈移植的OELD代码报错Symbol oled pow multiply defined 我查看了一下 发现在main c和SR04 c中都引用了OLED include oled h 如果将超声波代码里面的
  • AOP高级用法——获取方法的参数和返回值

    我们平时在使用springAop的时候 经常是将某一个方法定义为一个切入点 用来做前置 后置或环绕增强 但如果想得到切入点方法的参数 以及它的返回值就需要做一些特定的配置 普通的切面如下 Configuration Aspect publi
  • Python之defaultdict方法详解

    文章目录 字典dict介绍 collections defaultdict类 字典dict介绍 python中的dict是一个重要的数据类型 用 键 key 来索引 表示为dict key val 有以下特征 键可以是任何不可变 immut
  • Webpack5 - 区分开发和生产环境配置

    一 webpack 不同环境的配置 对于项目的开发和生产打包 这两种情况下 我们通常需要不同的webpack配置 有如下两种方法 可以针对不同环境 应用不同的 webpack 配置 二 方法一 根据环境不同导出不同的配置 webpack c
  • 【JavaScript编程语言】逻辑运算符,

    逻辑运算符 JavaScript 中有四个逻辑运算符 或 与 非 空值合并运算符 本文我们先介绍前三个 在下一篇文章中再详细介绍 运算符 虽然它们被称为 逻辑 运算符 但这些运算符却可以被应用于任意类型的值 而不仅仅是布尔值 它们的结果也同
  • PHP douyin无水印视频网页代码简版

  • arm汇编lr pc b bl ret指令函数调用和返回gif动图演示

    文章目录 pc 寄存器 lr寄存器 x30 ret返回指令 bl 跳转指令 带返回 b 跳转 不带返回 pc 寄存器 pc保存着当前指令执行的地址 相当于win32汇编里的eip寄存器 lr寄存器 x30 lr存储函数的返回地址 每次遇到r
  • 线程同步之Synchronized&CAS&各种锁的介绍及对比

    1 Synchronized 1 1 简介 Java的关键字 提供了并发场景下的数据可见性和原子性 保证线程安全 1 2 应用方式 修饰实例方法 对当前实例加锁 当两个不同的实例对象同时操作共享资源时 可能出现线程安全问题 public s
  • windows快速切换jdk版本号

    前言 因为老项目和新项目的需要 在电脑上需要切换jdk1 8和jdk17 其它版本jdk同样可以切换 网上有修改配置文件的方式 但是感觉比较繁琐 后来找到了通过bat文件和环境变量来快速切换jdk环境的方法 这里记录分享出出来 只需要通过命
  • 云备份和标准数据中心的备份有所不同

    云备份和标准数据中心的备份有所不同 当您需要实施某种基于云的系统恢复技术时 您有两种路线可以选择 但费用和风险各不相同 备份通常都是个很好的策略 您需要有能力在某个地方备份数据和应用程序 以便在某些自然或人为灾难的情况下依旧可以保持业务的运
  • verilog 01 基本概念

    语言整体介绍 硬件描述语言 用来描述组合电路和时序电路 代码分为 目标代码 和 验证代码 一般叫TB testbench 都需要用编译器仿真器编译 iverilog 源码 提供 编译器 iverilog 和 仿真器 vvp 目标代码 和 验
  • 解决Element中点开Dialog 对话框灰布在最上层的方法

    解决Element中点开Dialog 对话框灰布在最上层的方法 解决Element中点开Dialog 对话框灰布在最上层的方法 append to body Dialog 自身是否插入至 body 元素上 嵌套的 Dialog 必须指定该属
  • TCP如何保证可靠性传输

    校验和 在数据传输的过程中 将发送的数据段都当做一个16位的整数 将这些整数加起来 并且前面的进位不能丢弃 补在后面继续相加 最后取反 得到校验和 发送方 在发送数据之前计算检验和 并进行校验和的填充 接收方 收到数据后 对数据以同样的方式
  • 基于WebSocket和Android的多人实时聊天系统(Demo)的实现

    实现效果 服务端实现 服务端参考之前的这篇文件Android初学 使用WebSocket与服务器进行通信 这里做了一些修改 就是再服务端收到消息后 将消息群发给所有在线的客户端 服务端的Bean实体类 Data AllArgsConstru
  • 项目开发中的一些小配置,随时更新(springboot版本)

    这里是目录哦 1 appication properties 2 log4j properties 3 MySwaggerConfig java 4 MybatisplusConfig java 1 appication propertie
  • 如何使用Python 操作PDF?总结用Python操作PDF的几种方法

    本篇文章小编给大家分享一个用python来操作pdf图像的几种方法 如果有需求的小伙伴一定要耐心阅读完这篇文章 小编希望能够通过这篇文章来给大家的学习带来一定的帮助 Python操作PDF有以下几种方法 1 基本操作 PyPDF2 导入模块