Caso súper práctico, Python extrae contenido específico de PDF para generar un nuevo PDF

Muchas veces, no predecimos el número de página que queremos extraer, sino que queremos extraer y fusionar las páginas que contienen el contenido especificado en un nuevo PDF Este artículo tomará dos necesidades reales como ejemplo para explicar.

[Nota] Información, código, intercambio técnico, obtenido al final del artículo

01 Descripción del requisito

Los datos son un informe anual público de 286 páginas en PDF de las empresas que cotizan en bolsa, más o menos como sigueimagen

Ahora necesitamos usar Python para completar los siguientes dos requisitos

Requisito 1 : extraiga todas las páginas que contengan la palabra estrategia y fusione el nuevo PDF

Requisito 2 : extraiga todas las páginas que contengan imágenes y guárdelas como archivos PDF

02 Preconocimiento y clasificación lógica

2.1 Fusión de PyPDF2implementación del módulo

PyPDF2El código para importar un módulo suele ser:

from PyPDF2 import PdfFileReader, PdfFileWriter

Aquí se importan dos métodos:

  1. PdfFileReaderPuede ser entendido como un lector

  2. PdfFileWriterPuede ser entendido como un escritor.

Úselo PyPDF2para lograr la siguiente lógica de aplicación combinada:

  1. El lector lee todos los archivos PDF una vez

  2. El lector pasa el contenido leído al escritor.

  3. Writer salida unificada a un nuevo pdf

Punto de conocimiento implícito: el lector solo puede entregar el contenido leído al escritor página por página

2.2 Obtener y agregar páginas

Ambos códigos se mencionaron en nuestro tweet anterior y se enumeran a continuación como un repaso:

  1. .getPageObtener una página específica

  2. .addPageAñadir una página específica

2.3 Procesamiento de imágenes y texto

Para lograr los requisitos de este artículo, es necesario hacer un juicio muy importante: determinar si la página contiene texto o imágenes.

Es relativamente sencillo juzgar si se incluye un texto específico. Al atravesar cada página, el texto contenido se extrae y se juzga a nivel de cadena. La idea del código:

  1. pdfplumberAbrir archivos PDF con

  2. Obtenga la página especificada o recorra cada página

  3. Usa el .extract_text()método para extraer el texto de la página actual

  4. Determinar si "estrategia" está en el texto extraído

La idea de juzgar si incluir imágenes es similar a la anterior, pero el método es diferente. Se considera que la imagen se reconoce mediante un método normal fitzy recompara con y . Consulte el código a continuación para obtener más información.

03 Implementación de código

3.1 Implementación del Requisito 1

Primero, complete la tarea del requisito 1, importe las bibliotecas requeridas: lea y escriba archivos PDF PyPDF2y extraiga textopdfplumber

from PyPDF2 import PdfFileReader, PdfFileWriter
import pdfplumber

Especifique la ruta donde se encuentra el archivo, inicialice el escritor y entregue el archivo al lector:

path = r'C:\xxxxxx'
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(path + r'\公司年报.PDF')

Extraiga texto como administrador de contexto pdfplumberabriendo el archivo y usándolo .getNumPagespara obtener la página más grande del lector para recorrer 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())

La finalidad de extraer el texto es utilizarlo para el juicio, y utilizar el número de página que cumple con los requisitos como parámetro .getPagedel , y finalmente utilizarlo .addPagepara dárselo al redactor:

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())

Deje que el escritor emita el nombre de archivo deseado después de que se complete el reconocimiento:

with open(path + r'\new_公司年报.pdf', 'wb') as out:
    pdf_writer.write(out)

Hasta ahora, hemos completado la extracción de páginas con contenido de texto específico y las hemos integrado en un PDF. Todas las páginas contienen la palabra "estrategia":

imagenimagen

Requisito 1 El código completo es el siguiente, los lectores interesados ​​pueden estudiar por sí mismos

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 Implementación del Requisito 2

A continuación, complete la segunda tarea. Primero importe las bibliotecas requeridas:

from PyPDF2 import PdfFileReader, PdfFileWriter
import fitz
import re
import os

Especifique la ruta donde se encuentra el archivo:

path = r'C:\xxxxxx'

La parte del reconocimiento de imagen regular no se discutirá en detalle. El tweet anterior ya lo presentó. Veamos el código directamente:

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)

imagen

Después de obtener todas las páginas que contienen imágenes, se puede generar el nuevo PDF combinando la cooperación del lector y el escritor. Tenga en cuenta que este requisito es que todas las imágenes se envíen por separado, por lo que después de obtener la página, entréguesela al escritor para que la envíe directamente como un archivo:

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)

En este punto, el segundo requisito también se ha completado. Cabe señalar que actualmente no existe un método perfecto para extraer imágenes PDF, y el método presentado en este caso no es estable para reconocer imágenes. Los lectores pueden probar más con sus propios datos. El código completo es el siguiente:

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)

Una vez que se cumplen estos dos requisitos únicos, el código relacionado se puede encapsular y combinar con os y otros módulos para realizar operaciones por lotes, liberando manos.

Supongo que te gusta

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