Caso super prático, Python extrai conteúdo especificado em PDF para gerar novo PDF

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 seguefoto

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 PyPDF2Mesclagem de implementação do módulo

PyPDF2O código para importar um módulo geralmente é:

from PyPDF2 import PdfFileReader, PdfFileWriter

Dois métodos são importados aqui:

  1. PdfFileReaderPode ser entendido como um leitor

  2. PdfFileWriterPode ser entendido como um escritor

Use PyPDF2para obter a seguinte lógica de aplicação combinada:

  1. O leitor lê todos os pdfs uma vez

  2. O leitor passa o conteúdo lido para o escritor

  3. 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:

  1. .getPageObter uma página específica

  2. .addPageAdicionar 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:

  1. pdfplumberAbra arquivos PDF com

  2. Obtenha a página especificada ou percorra cada página

  3. Use o .extract_text()método para extrair o texto da página atual

  4. 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 fitze recorresponde 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 PyPDF2e 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 pdfplumberabrindo o arquivo e usando .getNumPagespara 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 .getPagedo 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":

fotofoto

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)

foto

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.

Acho que você gosta

Origin blog.csdn.net/weixin_38037405/article/details/124080053
Recomendado
Clasificación