PythonPythonPython

python办公自动化:pdf和word

2021-08-26  本文已影响0人  弦好想断

python 使用 PyPDF2 和 pdfplumber 操作pdf

python 提取 PDF 文字内容

1)利用 pdfplumber 提取文字

import PyPDF2 
import pdfplumber 
with pdfplumber.open("test.pdf") as p: 
page = p.pages[2] 
print(page.extract_text())#打印第3页所有文字

2)利用 pdfplumber 提取表格并写入 excel

import PyPDF2 
import pdfplumber 
from openpyxl import Workbook 
with pdfplumber.open("test.pdf") as p: 
page = p.pages[4] 
table = page.extract_table() 
print(table) 
workbook = Workbook()
sheet = workbook.active 
for row in table: 
  if not "".join([str(i) for i in row]) == "":
  #将列表中每个元素都连接成一个字符串,如果还是一个空字符串那么肯定就是空行。
    sheet.append(row)
  #sheet.append(row) #直接append这里提取出来的表格有很多空行
workbook.save(filename = "新pdf.xlsx")

3、PDF 合并及页面的排序和旋转

1)分割及合并 pdf

① 合并 pdf
首先,我们有如下几个文件,可以发现这里共有三个 PDF 文件需要我们合并。同时可以发现他们的文件名都是有规律的(如果文件名,没有先后顺序,我们合并起来就没有意义了。)

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_writer = PdfFileWriter() 
for i in range(1,len(os.listdir(r"G:\concat_pdf"))+1):
  print(i*50+1,(i+1)*50) 
  pdf_reader = PdfFileReader("G:\concat_pdf\{}-{}.pdf".format(i*50+1,(i+1)*50))  
  #这里是指文件名的格式为51-100,101-150、151-200
  for page in range(pdf_reader.getNumPages()):
    pdf_writer.addPage(pdf_reader.getPage(page)) 
with open("G:\concat_pdf\merge.pdf", "wb") as out: 
  pdf_writer.write(out)

② 拆分 pdf
这里有一个“时间序列.pdf”的文件,共 3 页,我们将其每一页存为一个 PDF 文件。

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"G:\concat_pdf\时间序列.pdf") 
for page in range(pdf_reader.getNumPages()): 
  pdf_writer = PdfFileWriter() 
  pdf_writer.addPage(pdf_reader.getPage(page)) 
  with open(f"G:\concat_pdf\\{page}.pdf", "wb") as out: 
    pdf_writer.write(out)

2)旋转及排序 pdf

① 旋转 pdf

from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"G:\concat_pdf\时间序列.pdf") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()): 
  if page % 2 == 0: 
    rotation_page = pdf_reader.getPage(page).rotateCounterClockwise(90) 
  else: 
    rotation_page = pdf_reader.getPage(page).rotateClockwise(90) 
  pdf_writer.addPage(rotation_page) 
  with open("G:\concat_pdf\旋转.pdf", "wb") as out: 
    pdf_writer.write(out)
""" 
上述代码中,我们循环遍历了这个 pdf,对于偶数页我们逆时针旋转 90°,对于奇数页我
们顺时针旋转 90°; 注意:旋转的角度只能是 90 的倍数;
"""

② 排序 pdf
PDF 文件需要倒序排列,应该怎么做呢?

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"G:\concat_pdf\时间序列.pdf") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()-1, -1, -1): 
#这里用到range,很巧妙
  pdf_writer.addPage(pdf_reader.getPage(page)) 
  with open("G:\concat_pdf\倒序.pdf", "wb") as out:
    pdf_writer.write(out)

4、pdf 批量加水印及加密、解密

1)批量加水印

from PyPDF2 import PdfFileReader, PdfFileWriter 
from copy import copy 
water = PdfFileReader(r"G:\concat_pdf\水印.pdf") 
water_page = water.getPage(0) 
pdf_reader = PdfFileReader(r"G:\concat_pdf\aa.pdf") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()): 
  my_page = pdf_reader.getPage(page) 
  new_page = copy(water_page) 
  new_page.mergePage(my_page) 
  pdf_writer.addPage(new_page) 
  with open("G:\concat_pdf\\添加水印后的 aa.pdf", "wb") as out: 
    pdf_writer.write(out) 
""" 
这里有一点需要注意:进行 pdf 合并的时候,我们希望“水印”在下面,
文字在上面,因此 是“水印”.mergePage(“图片页”)
"""

2)批量加密、解密

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"G:\concat_pdf\test.pdf") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()): 
pdf_writer.addPage(pdf_reader.getPage(page)) 
# 添加密码
pdf_writer.encrypt("a123456")
with open("G:\concat_pdf\\test.pdf", "wb") as out: 
pdf_writer.write(out)

② 解密 pdf 并保存为未加密的 pdf

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"G:\concat_pdf\test.pdf") 
# 解密
pdf pdf_reader.decrypt("a123456") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()): 
  pdf_writer.addPage(pdf_reader.getPage(page))
  with open("G:\concat_pdf\未加密.pdf", "wb") as out: 
    pdf_writer.write(out)

python 使用 python-docx 操作 word

1、python-docx 库介绍

2、Python 读取 Word 文档内容


2)python-docx 提取文字和文字块儿
① python-docx 提取文字
有一个这样的 docx 文件,提取其中的文字

from docx import Document 
doc = Document(r"G:\concat_word\test1.docx") 
print(doc.paragraphs) 
for paragraph in doc.paragraphs: 
  print(paragraph.text)

② python-docx 提取文字块儿

from docx import Document 
doc = Document(r"G:\concat_word\test1.docx") 
print(doc.paragraphs) 
for i range(len((doc.paragraphs)):
#这里按段落进行循环
  paragraph = doc.paragraphs[i] 
  runs = paragraph.runs 
  print(runs) 
  for run in paragraph.runs: 
    print(run.text)

3)利用 Python 向 Word 文档写入内容

from docx import Document 
doc = Document(r"G:\concat_word\test1.docx") 
# print(doc.add_heading("一级标题", level=1)) 添加一级标题的时候出错,还没有解决!
paragraph1 = doc.add_paragraph("这是一个段落") 
paragraph2 = doc.add_paragraph("这是第二个段落") 
doc.save(r"G:\concat_word\test1.docx") 
""" 
添加段落的时候,赋值给一个变量,方便我们后面进行格式调整;
"""
import docx

fn = r'D:\长恨歌.docx'
doc = docx.Document(fn)

# 按段落读取全部数据
for paragraph in doc.paragraphs:
    print(paragraph.text)

# 按表格读取全部数据
for table in doc.tables:
    for row in table.rows:
        for cell in row.cells:
            print(cell.text)

table_num = len(doc.tables)
# 获取文档的表格个数
print(table_num)

table_0 = doc.tables[0]
# 选取第一个表
table_rows = len(table_0.rows)
# 获取第一个表的行数
print(table_rows)

tab = doc.tables[0].rows[0].cells[0]
# 获取第一张表第一行第一列数据
print(tab.text)

par = doc.paragraphs[2]
# 读取第三段数据
print(par.text)
import docx
import pandas as pd
from docx import Document #导入库
path = "word2.docx" #文件路径
document = Document(path) #读入文件
tables = document.tables #获取文件中的表格集
table = tables[0]#获取文件中的第一个表格

for table in tables:
    columns = [table.cell(0,c).text for c in range(len(table.columns))]#获取表头 
#     print(columns)
    values = []
    for i in range(1,len(table.rows)):#从表格第二行开始循环读取表格数据
        result = [table.cell(i,c).text for c in range(len(table.columns))]# 自动获取每一行的数据
        #cell(i,0)表示第(i+1)行第1列数据,以此类推
#         print(result)
        values.append(result)
    print(values)
    print(columns)
    print(pd.DataFrame(data = values,columns=columns))

在操作word这块感觉并不怎么实用,等遇到问题了再加,也可以参考
https://juejin.cn/post/6868073137263607821

上一篇下一篇

猜你喜欢

热点阅读