Python对PDF文件的常用操作方法详解

作者:五包辣条! 时间:2021-10-13 06:49:56 

工具

python3.7

Pycharm

PDF

PyPDF2

reportlab

从PDF中提取文本

PyPDF2没有办法从PDF文档中提取图像、图表或其他媒体,但它可以提取文本,并将其返回为Python字符串。

import PyPDF2

reader = PyPDF2.PdfFileReader('test.pdf')
page = reader.getPage(0)
print(page.extractText())

旋转和叠加页面

上面的代码中通过创建PdfFileReader对象的方式来读取PDF文档,该对象的getPage方法可以获得PDF文档的指定页并得到一个PageObject对象,通过PageObject对象的rotateClockwise和rotateCounterClockwise方法可以实现页面的顺时针和逆时针方向旋转,通过PageObject对象的addBlankPage方法可以添加一个新的空白页,代码如下所示。

import PyPDF2

from PyPDF2.pdf import PageObject

# 创建一个读PDF文件的Reader对象
reader = PyPDF2.PdfFileReader('resources/xxx.pdf')
# 创建一个写PDF文件的Writer对象
writer = PyPDF2.PdfFileWriter()
# 对PDF文件所有页进行循环遍历
for page_num in range(reader.numPages):
   # 获取指定页码的Page对象
   current_page = reader.getPage(page_num)  # type: PageObject
   if page_num % 2 == 0:
       # 奇数页顺时针旋转90度
       current_page.rotateClockwise(90)
   else:
       # 偶数页反时针旋转90度
       current_page.rotateCounterClockwise(90)
   writer.addPage(current_page)
# 最后添加一个空白页并旋转90度
page = writer.addBlankPage()  # type: PageObject
page.rotateClockwise(90)
# 通过Writer对象的write方法将PDF写入文件
with open('resources/xxx.pdf', 'wb') as file:
   writer.write(file)

加密PDF文件

使用PyPDF2中的PdfFileWrite对象可以为PDF文档加密,如果需要给一系列的PDF文档设置统一的访问口令,使用Python程序来处理就会非常的方便。

import PyPDF2

reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
writer = PyPDF2.PdfFileWriter()
for page_num in range(reader.numPages):
   writer.addPage(reader.getPage(page_num))
# 通过encrypt方法加密PDF文件,方法的参数就是设置的密码
writer.encrypt('foobared')
with open('resources/XGBoost-encrypted.pdf', 'wb') as file:
   writer.write(file)

创建PDF文件

创建PDF文档需要三方库reportlab的支持,使用 pip install reportlab 命令安装

from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas

pdf_canvas = canvas.Canvas('resources/python创建.pdf', pagesize=A4)
width, height = A4

# 绘图
image = canvas.ImageReader('resources/xxx.jpg')
pdf_canvas.drawImage(image, 20, height - 395, 250, 375)

# 显示当前页
pdf_canvas.showPage()

# 注册字体文件
pdfmetrics.registerFont(TTFont('Font1', 'resources/fonts/Vera.ttf'))
pdfmetrics.registerFont(TTFont('Font2', 'resources/fonts/青呱石头体.ttf'))

# 写字
pdf_canvas.setFont('Font2', 40)
pdf_canvas.setFillColorRGB(0.9, 0.5, 0.3, 1)
pdf_canvas.drawString(width // 2 - 120, height // 2, '你好,世界!')
pdf_canvas.setFont('Font1', 40)
pdf_canvas.setFillColorRGB(0, 1, 0, 0.5)
pdf_canvas.rotate(18)
pdf_canvas.drawString(250, 250, 'hello, world!')

# 保存
pdf_canvas.save()

补充

合并PDF

from PyPDF2 import PdfFileReader, PdfFileWriter

def merge_pdfs(paths, output):
pdf_writer = PdfFileWriter()
for path in paths:
 pdf_reader = PdfFileReader(path)
 for page in range(pdf_reader.getNumPages()):
  # 将每页添加到writer对象
  pdf_writer.addPage(pdf_reader.getPage(page))
# 写入合并的pdf
with open(output, 'wb') as out:
 pdf_writer.write(out)
if __name__ == '__main__':
paths = ['document1.pdf', 'document2.pdf']
merge_pdfs(paths, output='merged.pdf')

添加水印

from PyPDF2 import PdfFileWriter, PdfFileReader
def create_watermark(input_pdf, output, watermark):
watermark_obj = PdfFileReader(watermark)
watermark_page = watermark_obj.getPage(0)
pdf_reader = PdfFileReader(input_pdf)
pdf_writer = PdfFileWriter()
# 给所有页面添加水印
for page in range(pdf_reader.getNumPages()):
 page = pdf_reader.getPage(page)
 page.mergePage(watermark_page)
 pdf_writer.addPage(page)
with open(output, 'wb') as out:
 pdf_writer.write(out)
if __name__ == '__main__':
create_watermark(
 input_pdf='Jupyter_Notebook_An_Introduction.pdf',
  output='watermarked_notebook.pdf',
 watermark='watermark.pdf')

来源:https://blog.csdn.net/AI19970205/article/details/124909974

标签:Python,操作,PDF
0
投稿

猜你喜欢

  • 巧用XSL和ASP在线编辑XML文档

    2008-10-25 14:54:00
  • Django+Celery实现动态配置定时任务的方法示例

    2021-06-11 13:56:19
  • 基于python实现操作redis及消息队列

    2021-08-06 22:31:29
  • Python趣味挑战之turtle库绘画飘落的银杏树

    2023-07-21 21:46:40
  • Python中条件语句、循环语句和pass语句的使用示例

    2021-05-13 23:23:27
  • Python unittest discover批量执行代码实例

    2023-08-14 14:05:37
  • Python序列操作之进阶篇

    2021-03-28 11:08:58
  • Python如何实现自带HTTP文件传输服务

    2023-01-05 05:04:15
  • 教你轻松了解MySQL数据库中的结果字符串

    2009-02-23 17:29:00
  • 一个将半角"转换为中文"的asp函数

    2007-09-19 11:47:00
  • 利用python实现可视化大屏

    2023-08-17 17:29:17
  • Python 京东云无线宝消息推送功能

    2021-08-19 09:45:57
  • python如何利用traceback获取详细的异常信息

    2023-06-14 00:53:18
  • 树型结构列出指定目录里所有文件的PHP类

    2023-11-17 04:49:04
  • 跨浏览器的本地存储(二):DOM:Storage

    2008-08-15 13:39:00
  • java 截取字符串(判断汉字)

    2023-06-29 23:38:19
  • 详解python中__name__的意义以及作用

    2021-11-20 19:44:24
  • tensorflow转onnx的实现方法

    2022-07-08 23:04:51
  • Python列表生成器的循环技巧分享

    2023-10-06 21:24:28
  • asp sqlserver 执行存储过程返回记录集报对象关闭时不允许操作

    2011-03-11 10:57:00
  • asp之家 网络编程 m.aspxhome.com