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 sigue
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 PyPDF2
implementación del módulo
PyPDF2
El código para importar un módulo suele ser:
from PyPDF2 import PdfFileReader, PdfFileWriter
Aquí se importan dos métodos:
-
PdfFileReader
Puede ser entendido como un lector -
PdfFileWriter
Puede ser entendido como un escritor.
Úselo PyPDF2
para lograr la siguiente lógica de aplicación combinada:
-
El lector lee todos los archivos PDF una vez
-
El lector pasa el contenido leído al escritor.
-
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:
-
.getPage
Obtener una página específica -
.addPage
Añ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:
-
pdfplumber
Abrir archivos PDF con -
Obtenga la página especificada o recorra cada página
-
Usa el
.extract_text()
método para extraer el texto de la página actual -
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 fitz
y re
compara 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 PyPDF2
y 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 pdfplumber
abriendo el archivo y usándolo .getNumPages
para 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 .getPage
del , y finalmente utilizarlo .addPage
para 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":
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)
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.