Muitas vezes, não prevemos o número da página que queremos extrair, mas queremos extrair e mesclar as páginas que contêm o conteúdo especificado em um novo PDF . Este artigo terá duas necessidades reais como exemplo para explicar.
[Nota] Informação, código, troca técnica, obtida no final do artigo
01 Descrição do requisito
Os dados são um PDF de relatório anual público de 286 páginas de empresas listadas, aproximadamente como segue
Agora precisamos usar o Python para completar os dois requisitos a seguir
Requisito 1 : Extraia todas as páginas que contêm a palavra estratégia e mescle o novo PDF
Requisito 2 : Extraia todas as páginas que contêm imagens e salve-as como arquivos PDF
02 Pré-conhecimento e classificação lógica
2.1 PyPDF2
Mesclagem de implementação do módulo
PyPDF2
O código para importar um módulo geralmente é:
from PyPDF2 import PdfFileReader, PdfFileWriter
Dois métodos são importados aqui:
-
PdfFileReader
Pode ser entendido como um leitor -
PdfFileWriter
Pode ser entendido como um escritor
Use PyPDF2
para obter a seguinte lógica de aplicação combinada:
-
O leitor lê todos os pdfs uma vez
-
O leitor passa o conteúdo lido para o escritor
-
Saída unificada do Writer para um novo pdf
Ponto de conhecimento implícito: o leitor só pode entregar o conteúdo lido ao escritor página por página
2.2 Obter e adicionar páginas
Ambos os códigos foram mencionados em nosso tweet anterior e estão listados abaixo como uma atualização:
-
.getPage
Obter uma página específica -
.addPage
Adicionar uma página específica
2.3 Processamento de imagens e texto
Para atingir os requisitos deste artigo, é necessário fazer um julgamento muito importante: determine se a página contém texto ou imagens
É relativamente simples julgar se um texto específico está incluído. Ao percorrer cada página, o texto contido é extraído e julgado no nível da string. A ideia do código:
-
pdfplumber
Abra arquivos PDF com -
Obtenha a página especificada ou percorra cada página
-
Use o
.extract_text()
método para extrair o texto da página atual -
Determinar se "estratégia" está no texto extraído
A ideia de julgar se deve incluir fotos é semelhante à acima, mas o método é diferente. A imagem é considerada reconhecida por um método regular fitz
e re
corresponde a e , consulte o código abaixo para obter detalhes
03 Implementação do código
3.1 Implementação do Requisito 1
Primeiro, conclua a tarefa do requisito 1, importe as bibliotecas necessárias: leia e grave arquivos PDF PyPDF2
e extraia textopdfplumber
from PyPDF2 import PdfFileReader, PdfFileWriter
import pdfplumber
Especifique o caminho onde o arquivo está localizado, inicialize o gravador e entregue o arquivo ao leitor:
path = r'C:\xxxxxx'
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(path + r'\公司年报.PDF')
Extraia o texto como um gerenciador de contexto pdfplumber
abrindo o arquivo e usando .getNumPages
para obter a maior página do leitor para percorrer cada página:
with pdfplumber.open(path + r'\公司年报.PDF') as pdf:
for i in range(pdf_reader.getNumPages()):
page = pdf.pages[i]
print(page.extract_text())
O objetivo de extrair o texto é usá-lo para julgamento, e usar o número da página que atende aos requisitos como parâmetro .getPage
do e, finalmente, usá .addPage
-lo para entregá-lo ao escritor:
with pdfplumber.open(path + r'\公司年报.PDF') as pdf:
for i in range(pdf_reader.getNumPages()):
page = pdf.pages[i]
print(page.extract_text())
if '战略' in page.extract_text():
pdf_writer.addPage(pdf_reader.getPage(i))
print(i + 1, page.extract_text())
Deixe o gravador produzir o nome de arquivo desejado após a conclusão do reconhecimento:
with open(path + r'\new_公司年报.pdf', 'wb') as out:
pdf_writer.write(out)
Até agora, concluímos a extração de páginas contendo conteúdo de texto específico e as integramos em um PDF. Todas as páginas contêm a palavra "estratégia":
Requisito 1 O código completo é o seguinte, leitores interessados podem estudar sozinhos
from PyPDF2 import PdfFileReader, PdfFileWriter
import pdfplumber
path = r'C:\xxx'
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(path + r'\公司年报.PDF')
with pdfplumber.open(path + r'\公司年报.PDF') as pdf:
for i in range(pdf_reader.getNumPages()):
page = pdf.pages[i]
print(page.extract_text())
if '战略' in page.extract_text():
pdf_writer.addPage(pdf_reader.getPage(i))
print(i + 1, page.extract_text())
with open(path + r'\new_公司年报1.pdf', 'wb') as out:
pdf_writer.write(out)
3.2 Implementação do Requisito 2
Em seguida, conclua a segunda tarefa. Primeiro importe as bibliotecas necessárias:
from PyPDF2 import PdfFileReader, PdfFileWriter
import fitz
import re
import os
Especifique o caminho onde o arquivo está localizado:
path = r'C:\xxxxxx'
A parte do reconhecimento de imagem regular não será discutida em detalhes. O tweet anterior já o apresentou. Vamos ver o código diretamente:
page_lst = []
checkImg = r"/Subtype(?= */Image)"
pdf = fitz.open(path + r'\公司年报.PDF')
lenXREF = pdf._getXrefLength()
for i in range(lenXREF):
text = pdf._getXrefString(i)
isImage = re.search(checkImg, text)
if isImage:
page_lst.append(i)
print(page_lst)
Depois de obter todas as páginas contendo imagens, o novo PDF pode ser gerado combinando a cooperação do leitor e do escritor. Observe que esse requisito é que todas as imagens sejam enviadas separadamente, portanto, depois de obter a página, entregue-a ao escritor para produzi-la diretamente como um arquivo:
pdf_reader = PdfFileReader(path + r'\公司年报.PDF')
for page in page_lst:
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf_reader.getPage(page))
with open(path + r'\公司年报_{}.pdf'.format(page + 1), 'wb') as out:
pdf_writer.write(out)
Neste ponto, o segundo requisito também foi concluído. Deve-se notar que atualmente não existe um método perfeito para extrair imagens PDF, e o método introduzido neste caso não é estável para o reconhecimento de imagens. Os leitores podem tentar mais com seus próprios dados. O código completo é o seguinte:
from PyPDF2 import PdfFileReader, PdfFileWriter
import fitz
import re
import os
path = r'C:\xxx'
page_lst = []
checkImg = r"/Subtype(?= */Image)"
pdf = fitz.open(path + r'\公司年报.PDF')
lenXREF = pdf._getXrefLength()
for i in range(lenXREF):
text = pdf._getXrefString(i)
isImage = re.search(checkImg, text)
if isImage:
page_lst.append(i)
print(page_lst)
pdf_reader = PdfFileReader(path + r'\公司年报.PDF')
for page in page_lst:
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf_reader.getPage(page))
with open(path + r'\公司年报_{}.pdf'.format(page + 1), 'wb') as out:
pdf_writer.write(out)
Depois que esses dois requisitos únicos são realizados, o código relacionado pode ser encapsulado e combinado com os e outros módulos para realizar operações em lote, liberando as mãos.