python操作pdf

2023-10-27

一、pypdf2的使用

from PyPDF2 import PdfReader, PdfWriter#导入

1.pdf文件读操作

1)读取文件reader

reader = PdfReader('files/HEU_KMS_Activator_v20.0.0用户使用手册.pdf')#读到这个文件

2)获取总的页数

num = reader.getNumPages()
print(num)

3)获取指定的页(页数从0开始)

p1 = reader.getPage(0)#第一页(相当于下标)
p2 = reader.getPage(1)

2.pdf文件写操作

1)创建一个空的pdf

writer = PdfWriter()

2)添加指定页

writer.addPage(p1)
writer.addPage(p2)

3)添加空白页

writer.addBlankPage()

4)插入指定页

writer.insertPage(p1, 2)#后面是下标(相当于插入在第三页(2)前面)

5)保存

writer.write('files/new.pdf')#保存路径可以不写原文件的名字,就不会覆盖

3.添加水印

from PyPDF2 import PdfWriter, PdfReader
import os

1.准备水印页面

reader1 = PdfReader('files/water.pdf')
water = reader1.getPage(0)

2.准备需要添加水印的文件

reader2 = PdfReader('files/HEU_KMS_Activator_v20.0.0用户使用手册.pdf')
page = reader2.getPage(0)

3.添加水印

page.mergePage(water)

4.将添加完水印的页面添加到空的pdf中

writer = PdfWriter()
writer.addPage(page)

writer.write('files/水印1.pdf')

4.练习题

1.给MySQL.pdf文件添加封面

from PyPDF2 import PdfReader, PdfWriter
# 1)准备封面
reader1 = PdfReader('files/HEU_KMS_Activator_v20.0.0用户使用手册.pdf')
cover = reader1.getPage(0)
# 2)需要添加封面的文件的reader
reader2 = PdfReader('files/MySQL.pdf')
# 3)准备空的pdf
writer = PdfWriter()
# 4)往空的pdf中加页面
writer.addPage(cover)
for x in range(reader2.getNumPages()):
    page = reader2.getPage(x)
    writer.addPage(page)
writer.write('files/MySQL.pdf')

2.将两个pdf文件合并成一个pdf文件

# 1)准备需要合并pdf文件对应的reader
reader1 = PdfReader('files/HEU_KMS_Activator_v20.0.0用户使用手册.pdf')
reader2 = PdfReader('files/MySQL.pdf')

# 2)准备空的pdf对应的writer
writer = PdfWriter()

# 3)依次添加reader中的页面
for x in range(reader1.getNumPages()):
    page = reader1.getPage(x)
    writer.addPage(page)
for x in range(reader2.getNumPages()):
    page = reader2.getPage(x)
    writer.addPage(page)
writer.write('files/合并.pdf')

3.删除pdf文件中所有下标为奇数的页(下标从0开始)

# 1)准备需要删除页面的pdf
reader = PdfReader('files/MySQL.pdf')

# 2)准备新的pdf
writer = PdfWriter()

# 3)将下标为偶数的页添加到新的pdf中
for x in range(0, reader.getNumPages(), 2):
    page = reader.getPage(x)
    writer.addPage(page)

writer.write('files/new_mysql.pdf')

4.在pdf文件中的每一页的后添加都添加一个空白页

reader = PdfReader('files/MySQL.pdf')
writer = PdfWriter()
for x in range(reader.getNumPages()):
    page = reader.getPage(x)
    writer.addPage(page)
    writer.addBlankPage()

writer.write('files/new_mysql2.pdf')

5.练习:给pdf文件的每一页都添加上水印

water = PdfReader('files/water.pdf').getPage(0)
reader = PdfReader('files/MySQL.pdf')
writer = PdfWriter()
for x in range(reader.getNumPages()):
    page = reader.getPage(x)
    page.mergePage(water)
    writer.addPage(page)
writer.write('files/mysql(水印).pdf')

6.自己的写法(和老师一样,方便回顾看)

from PyPDF2 import PdfReader,PdfWriter
reader = PdfReader('files/MySQL.pdf')
num = reader.getNumPages()
p1 = reader.getPage(0)
writer = PdfWriter()#创建空的pdf
# 1.给MySQL.pdf文件添加封面
for x in range(0,num):
    px = reader.getPage(x)#获取页
    writer.addPage(px)
writer.insertPage(p1,0)
writer.write('files/N_MySQL.pdf')

# 2.将两个pdf文件合并成一个pdf文件
writer1 = PdfWriter()#创建空的pdf
reader1 = PdfReader('files/HEU_KMS_Activator_v20.0.0用户使用手册.pdf')
num = reader.getNumPages()
num1 = reader1.getNumPages()
for x in range(0,num):
    px = reader.getPage(x)#获取页
    writer1.addPage(px)
for y in range(0,num1):
    py = reader1.getPage(y)
    writer1.addPage(py)
writer1.write('files/M_H.pdf')

# 3.删除pdf文件中所有下标为奇数的页(下标从0开始)
writer3 = PdfWriter()#创建空的pdf
for x in range(0,num,2):
    px = reader.getPage(x)#获取页
    writer3.addPage(px)
writer3.write('files/3oushu.pdf')

# 4.在pdf文件中的每一页的后添加都添加一个空白页
writer4 = PdfWriter()#创建空的pdf
for x in range(num):
    px = reader.getPage(x)
    writer4.addPage(px)
    writer4.addBlankPage()
writer4.write('files/加kb.pdf')

# 练习5:给pdf文件的每一页都添加上水印

reader2 = PdfReader('files/water.pdf')
sy = reader2.getPage(0)
writer5 = PdfWriter()#创建空的pdf
for x in range(num):
    px = reader.getPage(x)
    px.mergePage(sy)
    writer5.addPage(px)
writer5.write('files/加sy.pdf')

二、创建水印-用画布

# 用来创建画布(常见空白的pdf文件)
from reportlab.pdfgen.canvas import Canvas
# 用来对字体进行注册
from reportlab.pdfbase.pdfmetrics import registerFont
from reportlab.pdfbase.ttfonts import TTFont

1.创建一个空白文件(画布)

# 在指定的位置新建空白的pdf文件:Canvas(文件路径)
file = Canvas('files/MyWater.pdf')

2.添加文字

1)注册字体

registerFont(TTFont('f1', 'files/font1.ttf'))
registerFont(TTFont('f2', 'files/font2.ttf'))#字体需要提前下载放入文件夹

2)设置字体的名字和字体大小

file.setFont('f2', 40)#字体名和大小,用前面注册的名字

3)设置字体颜色

# r、g、b: 0 ~ 1(用颜色的rgb值除以255)
# 透明度:0 ~ 1,0是完全透明,1是不透明
file.setFillColorRGB(139/255, 69/255, 19/255, 0.7)

4)旋转

file.rotate(45)#旋转的是画布

# 文件对象.drawString(x坐标, y坐标,'内容' )
file.drawString(200, 100, '你好世界!')#上面画布旋转了45度,所以此时输入的内容是呈现旋转以后的样式

file.rotate(-45)#将画布旋转回来
file.setFont('f1', 12)
file.setFillColorRGB(180/255, 180/255, 180/255, 0.7)
file.drawString(100, 0, 'hello world!')#画布旋转回来以后新输入的内容呈现的样式是正常样式(非倾斜),原本已经倾斜的不会随着画布后面转回而转回来

3.渲染图片

# 文件对象.drawImage(图片地址, x坐标, y坐标, mask='auto')
file.drawImage('files/car.png', 0, 0, mask='auto')

# 保存
file.save()#保存不需要提供地址了,画布在创建时已经提供了地址。

三、补充:获取文件夹中所有的文件的名字: os.listdir(文件夹地址)

result = os.listdir('files')#列表

1.练习作业

*导入相关模块

from reportlab.pdfgen.canvas import Canvas#画布模块
from reportlab.pdfbase.pdfmetrics import registerFont#注册字体
from reportlab.pdfbase.ttfonts import TTFont#注册字体
from PyPDF2 import PdfReader, PdfWriter#pdf读和写
import os#可以获取文件夹相关数据,批量操作pdf加水印

1)准备一个水印

hb = Canvas('files/sy-dog.pdf')
registerFont(TTFont('f1', 'files/zt.ttf'))
hb.setFont('f1', 40)
hb.setFillColorRGB(150/255, 63/255, 28/255, 0.4)
hb.rotate(50)
hb.drawString(450, 80, '哒哒哒哒哒~')
hb.rotate(-20)
hb.drawImage('files/dog.png', 260,50, mask='auto')
hb.save()

#满屏水印
hb = Canvas('files/sy-dog.pdf')
registerFont(TTFont('f1', 'files/zt.ttf'))
hb.setFont('f1', 40)
hb.setFillColorRGB(150/255, 63/255, 28/255, 0.4)
hb.rotate(50)
hb.drawString(450, 80, '哒哒哒哒哒~')
hb.rotate(-20)
for x in range(-400,1200,100):
    for y in range(-400,1200,100):
        hb.drawImage('files/dog.png', x,y, mask='auto',width=40,preserveAspectRatio=True)
hb.save()

2)给单个pdf每一页加水印

reader = PdfReader('files/sy-dog.pdf')
sy = reader.getPage(0)
reader1 = PdfReader('files/MySQL.pdf')
num = reader1.getNumPages()
writer = PdfWriter()
for x in range(num):
    px = reader1.getPage(x)
    px.mergePage(sy)
    writer.addPage(px)
writer.write('files/加水印版mysql.pdf')

3)给批量pdf加水印(每页)

writer1 = PdfWriter()
result = os.listdir('input')
for x in result:
    path = 'output/' + x
    reader3 = PdfReader('input/'+x)
    num1 = reader3.getNumPages()
    for y in range(num1):
        py = reader3.getPage(y)
        py.mergePage(sy)
        writer1.addPage(py)
    writer1.write(path)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python操作pdf 的相关文章

  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何使用间隙分隔pdf中的段落?

    我有一些 pdf 文件 每页有 2 3 个段落 每个段落都由一些行间隙分隔 但是在使用 pymupdf 阅读时 我看不到段落之间有任何机器可打印的分隔符 还有其他方法吗 其他图书馆可以做到这一点吗 code import fitz from
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • 适用于 iPhone / iPad / iOS 的快速、精益 PDF 查看器 - 提示和提示?

    最近有很多关于绘制 PDF 的问题 是的 您可以使用UIWebView但这无法提供您所期望的优秀 PDF 查看器的性能和功能 您可以绘制PDF页面到 CALayer http www cocoabuilder com archive coc
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 前沿交互技术在游戏中的应用

    获取数据的挑战 不过 生物特征识别的数据收集并不简单 在成本和时间承诺方面 它几乎是折扣可用性的极端对立 所有这些方法都需要专门的设备和软件来收集测量值并记录数据 对数据的分析也可能很耗时 并且需要比调查和可用性方法更高的统计复杂度 Per
  • 服务器端使用visdom进行可视化并更换端口(亲测有效)

    Visdom 是 Facebook 开源的一款用于创建 组织和共享实时丰富数据的可视化工具 通常结合pytorch结合使用很方便 服务器端使用visdom进行可视化 启动visdom本地可视化的方法很简单 只要在终端输入visdom或pyt
  • 笔记本怎么查看hdmi版本_同宗不同命!看着一样的笔记本的接口为啥差这么多?...

    点击上方 电脑爱好者 关注我们 每一款最新上市的笔记本身上都会配备两种USB接口 一种是标准的USB Type A 另一种就是USB Type C 后者也就是新款手机常用的支持正反插的新型接口 但是 长得一样 的USB接口 在传输速度和功能
  • [Linux]套接字通信

    摘于https subingwen cn 作者 苏丙榅 侵删 文章目录 1 套接字 socket 1 1 概念 1 2 网络协议 1 3 socket编程 1 3 1 字节序 1 3 2 IP地址转换 1 3 3 sockaddr 数据结构
  • xshell传输文件到服务器(ubuntu)(上传下载)

    一 利用xshell上传下载内容 点击xftp按钮 绿色按钮 出现一个对话框 对话框左边是本地的文件预览 对话框右边是服务器当前路径的文件预览 上传下载文件 直接拖拉内容 二 其他方式 1 xshell连接服务器 本地虚拟机 2 首先在服务
  • batch_size

    目录 3 5 Batch Size 3 5 1 为什么需要 Batch Size 3 5 2 Batch Size 值的选择 3 5 3 在合理范围内 增大Batch Siz
  • Qt 中QButtonGroup 的用法

    今天我们介绍下QButtonGroup的用法 按照字面意思理解就是按钮组 QButtonGroup能够用到很多地方 比如和QStackedWidget合起来使用能够达到实现tab 也可以单独使用形成多个按钮单选的需求 构造 QButtonG
  • vite+vue3+ts (1-创建工程)

    1 使用npm创建工程 node版本必须在12以上 npm init vitejs app 2 输入工程名 选择vue vue ts PS D vite gt npm init vitejs app npx 7 安装成功 用时 1 703
  • 【图片识别】基于Hough变化的答题卡识别(Matlab代码实现)

    本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 为了提高视频图像关键帧提取及修复效果 设计了一种基于计算机视觉的视频图像关键帧提取及修复方法 基于计算机视觉进行视频图像采集 采用阈值分割法建立灰
  • Error (suppressible): (vsim-3601) Iteration limit 10000000 reached at time 10520 ns.

    modelsim仿真拨错 vsim 3601 Iteration limit 10000000 reached 仿真迭代达到限制次数 超出迭代界限 问题 代码中存在逻辑回环 即将一个组合逻辑单元赋值产生的敏感变量与另一个组合逻辑相关 同时作
  • SQL数据库笛卡尔积、投影、选择、连接运算

    笛卡尔积 笛卡尔积之后 列数 R列数 S列数 行数 R列数 S列数 投影 主要从列的角度进行运算 投影之后不仅取消了原关系中某些列 也可能取消某些元组 元组就是行 目的是为了避免重复行 选择 图片中 式子意思是 从关系R中找到B列里等于 并
  • 【Mo 人工智能技术博客】深度神经网络——中文语音识别

    1 背景介绍 语音是人类自然的交互方式 计算机发明之后让机器能够 听懂 人类的语言 理解语言含义 并能做出正确回答就成为了人们追求的目标 这个过程主要采用了 3 种技术 即自动语音识别 automatic speech recognitio
  • 详解 ERC-20 vs ERC-777、ERC-721 vs ERC-1155: 它们有何不同?

    ERC 20 ERC 777 ERC 721 和 ERC 1155 是以太坊上最受欢迎的通证标准 它们具体指什么以及各有什么不同 1 什么是ERC 在我们开始深入讲不同的通证标准之前 需要追根溯源一下什么是 ERC ERC 是 Ethere
  • 获取html table下元素

    1 js 获取table下列表数据 var table document getElementById yhwclwhjlList 获取id为 yhwclwhjlList 的table var rows table rows length
  • 虚拟DOM和diff算法

    虚拟DOM Virtual dom 也就是我们常说的虚拟节点 它是通过JS的Object对象模拟DOM中的节点 然后再通过特定的render方法将其渲染成真实的DOM的节点 为什么要使用虚拟DOM呢 因为操作真实DOM的耗费的性能代价太高
  • (15)Qt绘图(two)

    目录 坐标变换 平移坐标轴 缩放坐标轴 旋转坐标轴 定时器加坐标轴旋转实现动画旋转 transform旋转 可设置旋转轴 绕X轴旋转 绕Y轴旋转 绕Z轴旋转 错切 Y轴错切 X轴错切 画家的保存与坐标复原 基本图形绘制 绘制点 绘制线 绘制
  • Navicat mysql 数据库备份和使用,备份以后是nb3文件

    通过Navicat进行Mysql数据库自动备份与还原 Mysql数据库自动备份流程 Navicat版本为 Navicat 12 0 26 例 test为用于测试自动备份的数据库 里面有表t person 表中有两条数据 1 点击 自动运行
  • oracle-常用sql

    wishyouhappy https www cnblogs com wishyouhappy p 3700683 html char 1 基本 2 数学函数 3 rownum 4 分页 5 时间处理 6 字符函数 7 to number
  • MVC设计模式理解

    视图 视图是用户看到并与之交互的界面 对老式的Web应用程序来说 视图就是由HTML元素组成的界面 在新式的Web应用程序中 HTML依旧在视图中扮演着重要的角色 但一些新的技术已层出不穷 它们包括Adobe Flash和像XHTML XM
  • python操作pdf

    一 pypdf2的使用 from PyPDF2 import PdfReader PdfWriter 导入 1 pdf文件读操作 1 读取文件reader reader PdfReader files HEU KMS Activator v