I. Introdução
Olá a todos, Eu já escrevi um caso sobre Python operacional PDF. A intenção original deste caso é fornecer a vocês um script conveniente. Ele não explica muito o princípio. Envolve um módulo muito prático para processamento de PDF PyPDF2
. Este artigo irá analisá-lo. Este módulo envolverá principalmente
os
Aplicação abrangente de módulosglob
Aplicação abrangente de módulosPyPDF2
Operação do módulo
2. Operação básica
O código para o módulo de importação PyPDF2 é frequentemente:
from PyPDF2 import PdfFileReader, PdfFileWriter
Dois métodos são importados aqui:
PdfFileReader
Pode ser entendido como um leitorPdfFileWriter
Pode ser entendido como escritor
A seguir, vamos entender melhor as maravilhas dessas duas ferramentas por meio de alguns casos. O arquivo de amostra utilizado é o pdf de 5 faturas. Cada PDF de fatura consiste em duas páginas:
Três, fundir
O primeiro trabalho é mesclar 5 PDFs de faturas em 10 páginas . Como o leitor e o escritor devem trabalhar juntos aqui?
A lógica é a seguinte:
- O leitor lê todos os PDFs uma vez
- O leitor passa o conteúdo lido para o escritor
- Saída unificada do escritor para um novo pdf
Também há um ponto importante de conhecimento aqui: o leitor só pode entregar o conteúdo lido ao escritor página por página.
Portanto, a primeira e a segunda etapas na lógica não são realmente etapas independentes , mas depois que o leitor ler um pdf, ele fará um loop em todas as páginas do pdf e as entregará ao redator página por página. Finalmente, espere até que todo o trabalho de leitura termine antes de enviar.
Olhar para o código pode tornar a ideia mais clara:
from PyPDF2 import PdfFileReader, PdfFileWriter
path = r'C:\Users\xxxxxx'
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'\合并PDF\merge.pdf', 'wb') as out:
pdf_writer.write(out)
Como todo o conteúdo precisa ser entregue ao mesmo gravador para saída final, a inicialização do gravador deve ser fora do corpo do loop.
Se estiver no corpo do loop, ele se tornará um novo gravador gerado toda vez que um pdf for acessado e lido , de modo que o conteúdo de cada leitor entregue ao gravador será sobrescrito repetidamente e nossos requisitos de mesclagem não podem ser alcançados!
O código no início do corpo do loop:
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)
方法输出即可
四、拆分
如果明白了合并操作中读取器和写入器的配合,那么拆分就很好理解了,这里我们以拆分INV1.pdf
为2个单独的pdf文档为例,同样也先来捋一捋逻辑:
- 读取器读取PDF文档
- 读取器一页一页交给写入器
- 写入器每获取一页就立即输出
通过这个代码逻辑我们也可以明白,写入器初始化和输出的位置一定都在读取PDF循环每一页的循环体内,而不是在循环体外
代码很简单:
from PyPDF2 import PdfFileReader, PdfFileWriter
path = r'C:\Users\xxx'
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)
五、水印
本次的工作是将下图作为水印添加到INV1.pdf
中首先是准备工作,将需要作为水印的图片插入word中调整合适位置后保存为PDF文件。然后就可以码代码了,需要额外用到copy
模块,具体解释见下图:就是把读取器和写入器初始化,并且把水印PDF页先读取好备用,核心代码稍微比较难理解:加水印本质上就是把水印PDF页和需要加水印的每一页都合并一遍
由于需要加水印的PDF可能有很多页,而水印PDF只有一页,因此如果直接把水印PDF拿来合并,可以抽象理解成加完第一页,水印PDF页就没有了。
Portanto, não pode ser mesclado diretamente . Em vez disso, as páginas PDF com marca d'água devem ser copy
geradas continuamente em novas páginas new_page
para uso posterior e, em seguida, use o .mergePage
método para concluir a mesclagem com cada página e, em seguida, entregue as páginas mescladas ao redator para saída unificada!
Sobre .mergePage
o uso: aparece na página seguinte mergePage (aparece na página superior) , o efeito final é como mostrado na figura:
Seis, criptografia
A criptografia é muito simples, basta lembrar: "A criptografia é para a criptografia do gravador"
Então, só precisa ligar após a operação relevante ser concluídapdf_writer.encrypt(密码)
Pegue a criptografia de um único PDF como exemplo:
Escreva no final
É claro que, além da mesclagem, divisão, criptografia e marca d'água do PDF, podemos usar o nó Python do Excel e do Word para atender a mais necessidades de automação . Cabe ao leitor desenvolvê-las.
Por fim, espero que todos possam entender que um dos pontos principais da automação de escritório em Python é liberar as operações em lote e automatizar tarefas complexas!