Beim Schreiben eines Berichts wurde es schwierig, Bilder (Schaltpläne usw.) aus dem im PDF-Format gesendeten PDF zu schneiden und zu speichern und nur die Tabelle zu kopieren. Die nützlichen Apps und der Code, mit denen sie erstellt wurden, waren kein kurzer Überblick. Dann lass es uns schaffen. Die Tabellenextraktion hat nicht funktioniert, aber ich konnte die Werte abrufen, sodass die Belastung reduziert wurde (; ^ _ ^ A).
Ich habe es auch auf Git gesetzt, wenn es in Ordnung ist https://github.com/kzrn3318/create_img_excel_from_pdf
Installation der erforderlichen Bibliotheken
pip install pypdf2
pip install pillow
pip install PyMuPDF
pip install fitz
pip install pandas
pip install camelot-py[cv]
Wenn Sie zur Laufzeit kein Ghostscript haben, wird möglicherweise eine Fehlermeldung angezeigt. In diesem Fall installieren Sie bitte Ghostscript. Da es sich zum Zeitpunkt der Codeerstellung um Windows 10 handelt, funktioniert es aufgrund der Zeichenfolge des Pfads möglicherweise nicht mit anderen Betriebssystemen. In diesem Fall schreiben Sie es bitte neu, damit der Pfad des Codes angewendet werden kann. Wir haben die Operation mit anderen Betriebssystemen nicht bestätigt.
Unten ist der Code
main.py
import PyPDF2
from PIL import Image
import sys,os
import glob
import fitz
import camelot
import pandas as pd
def create_dir(img_dir , pdf_dir , excel_dir):
img_dir_glob = glob.glob(str(img_dir))
pdf_dir_glob = glob.glob(str(pdf_dir))
excel_dir_glob = glob.glob(str(excel_dir))
if len(pdf_dir_glob) > 0:
pass
else:
os.mkdir(str(pdf_dir))
if len(img_dir_glob) > 0:
pass
else:
os.mkdir(str(img_dir))
if len(excel_dir_glob) > 0:
pass
else:
os.mkdir(str(excel_dir))
def create_page_pdf(pdf,page_count,pdf_dir):
pdf_writer = PyPDF2.PdfFileWriter()
pdf_writer.addPage(pdf.getPage(page_count))
with open(".\\"+str(pdf_dir)+"\pdf{}.pdf".format(page_count),"wb") as f:
pdf_writer.write(f)
def create_png(pdf_path,page_count,img_dir):
pdf = fitz.open(pdf_path)
for num in range(len(pdf)):
num_count = 0
for image in pdf.getPageImageList(num):
num_count += 1
xref = image[0]
pix = fitz.Pixmap(pdf,xref)
if pix.n < 5:
pix.writePNG(".\\"+str(img_dir)+"\img{}_{}.png ".format(page_count,num_count))
else:
pix = fitz.Pixmap(fitz.csRGB,xref)
pix.writePNG(".\\"+str(img_dir)+"\img{}_{}.png ".format(page_count,num_count))
pix = None
pdf.close()
def create_excel(pdf_path,excel_dir,data_count):
datas = camelot.read_pdf(pdf_path,split_text=True)
data_count = data_count
for data in datas:
data_count += 1
df = data.df
with pd.ExcelWriter(".\\"+str(excel_dir)+"\\from_pdf_{}.xlsx".format(data_count)) as file:
df.to_excel(file,sheet_name="sheet1",index=False,header=False)
return data_count
if __name__ == "__main__":
args = sys.argv
print([i for i in args])
if len(args) >= 5:
print("Erhielt ein Argument.")
pdf_file = args[1]
pdf_dir = args[2]
img_dir = args[3]
excel_dir = args[4]
else:
try:
pdf_file = args[1]
print("Da das Argument nicht angegeben wurde, wird der Standardwert verwendet.")
except:
raise ValueError("Mindestens eine PDF-Datei muss das Argument sein. Geben Sie bei der Angabe des Ausgabeverzeichnisses vier Argumente an.")
pdf_dir ="pdf_list"
img_dir="img_list"
excel_dir="excel_data"
pdf = PyPDF2.PdfFileReader(pdf_file)
print("Bildverzeichnis:"+str(img_dir))
print("pdf Verzeichnis jeder Seite:"+str(pdf_dir))
print("Excel-Datenverzeichnis:"+str(excel_dir))
create_dir(img_dir,pdf_dir,excel_dir)
page_count = 0
for page in pdf.pages:
create_page_pdf(pdf,page_count,pdf_dir)
page_count += 1
path_list = glob.glob(".\\"+pdf_dir+"\*.pdf")
page_count = 0
data_count = 0
for path in path_list:
page_count += 1
create_png(path,page_count,img_dir)
data_count = create_excel(path,excel_dir,data_count)
print("Verarbeitung beenden\n")
Die Ausführungsmethode lautet wie folgt: Bitte führen Sie sie im selben Verzeichnis wie das Ziel-PDF aus. Zum Zeitpunkt der Ausführung werden ein Verzeichnis zum Speichern der ausgelagerten PDF-Version, ein Verzeichnis zum Speichern des aus PDF extrahierten Bildes und ein Verzeichnis zum Extrahieren und Speichern der Tabelle aus PDF erstellt. Sie können sie mit Befehlszeilenargumenten angeben.
python main.py (Ziel.pdf) (pagin paginiertes Verzeichnis) (pdf Bildverzeichnis extrahieren) (Extraktionsverzeichnis für PDF-Tabellen)
Beispiel
python main.py train1.pdf pdf_dir img_dir excel_dir
Im obigen Beispiel wird PDF für jede Seitenteilung direkt unter pdf_dir gespeichert. Speichern Sie das extrahierte Bild in img_dir. Speichern Sie die extrahierte Tabelle in excel_dir, konvertiert in excel.
import PyPDF2
from PIL import Image
import sys,os
import glob
import fitz
import camelot
import pandas as pd
Wie Sie sehen können, sehen es Leute, die normalerweise Python schreiben, oft. Importieren Sie jedes Paket.
def create_dir(img_dir , pdf_dir , excel_dir):
img_dir_glob = glob.glob(str(img_dir))
pdf_dir_glob = glob.glob(str(pdf_dir))
excel_dir_glob = glob.glob(str(excel_dir))
if len(pdf_dir_glob) > 0:
pass
else:
os.mkdir(str(pdf_dir))
if len(img_dir_glob) > 0:
pass
else:
os.mkdir(str(img_dir))
if len(excel_dir_glob) > 0:
pass
else:
os.mkdir(str(excel_dir))
Es ist eine Verzeichniserstellungsfunktion, die bestimmt, ob das empfangene Argument bereits vorhanden ist oder nicht, und es erstellt, wenn es nicht vorhanden ist.
def create_page_pdf(pdf,page_count,pdf_dir):
pdf_writer = PyPDF2.PdfFileWriter()
pdf_writer.addPage(pdf.getPage(page_count))
with open(".\\"+str(pdf_dir)+"\pdf{}.pdf".format(page_count),"wb") as f:
pdf_writer.write(f)
Es ist eine Funktion, die das Original-PDF in Seiten unterteilt und diese speichert. Erstellen Sie pdf (Seitenzahl) .pdf direkt unter pdf_dir.
def create_png(pdf_path,page_count,img_dir):
pdf = fitz.open(pdf_path)
for num in range(len(pdf)):
num_count = 0
for image in pdf.getPageImageList(num):
num_count += 1
xref = image[0]
pix = fitz.Pixmap(pdf,xref)
if pix.n < 5:
pix.writePNG(".\\"+str(img_dir)+"\img{}_{}.png ".format(page_count,num_count))
else:
pix = fitz.Pixmap(fitz.csRGB,xref)
pix.writePNG(".\\"+str(img_dir)+"\img{}_{}.png ".format(page_count,num_count))
pix = None
pdf.close()
Speichern Sie das extrahierte Bild direkt unter img_dir im PNG-Format. Der Dateiname lautet img (Seitenzahl) _ (Bildnummer auf der Seite) .png.
def create_excel(pdf_path,excel_dir,data_count):
datas = camelot.read_pdf(pdf_path,split_text=True)
data_count = data_count
for data in datas:
data_count += 1
df = data.df
with pd.ExcelWriter(".\\"+str(excel_dir)+"\\from_pdf_{}.xlsx".format(data_count)) as file:
df.to_excel(file,sheet_name="sheet1",index=False,header=False)
return data_count
Speichern Sie das konvertierte Excel direkt unter excel_dir.
def create_excel(pdf_path,excel_dir,data_count):
datas = camelot.read_pdf(pdf_path,split_text=True)
data_count = data_count
for data in datas:
data_count += 1
df = data.df
with pd.ExcelWriter(".\\"+str(excel_dir)+"\\from_pdf_{}.xlsx".format(data_count)) as file:
df.to_excel(file,sheet_name="sheet1",index=False,header=False)
return data_count
if __name__ == "__main__":
args = sys.argv
print([i for i in args])
if len(args) >= 5:
print("Erhielt ein Argument.")
pdf_file = args[1]
pdf_dir = args[2]
img_dir = args[3]
excel_dir = args[4]
else:
try:
pdf_file = args[1]
print("Da das Argument nicht angegeben wurde, wird der Standardwert verwendet.")
except:
raise ValueError("Mindestens eine PDF-Datei muss das Argument sein. Geben Sie bei der Angabe des Ausgabeverzeichnisses vier Argumente an.")
pdf_dir ="pdf_list"
img_dir="img_list"
excel_dir="excel_data"
pdf = PyPDF2.PdfFileReader(pdf_file)
print("Bildverzeichnis:"+str(img_dir))
print("pdf Verzeichnis jeder Seite:"+str(pdf_dir))
print("Excel-Datenverzeichnis:"+str(excel_dir))
create_dir(img_dir,pdf_dir,excel_dir)
page_count = 0
for page in pdf.pages:
create_page_pdf(pdf,page_count,pdf_dir)
page_count += 1
path_list = glob.glob(".\\"+pdf_dir+"\*.pdf")
page_count = 0
data_count = 0
for path in path_list:
page_count += 1
create_png(path,page_count,img_dir)
data_count = create_excel(path,excel_dir,data_count)
print("Verarbeitung beenden\n")
Dies ist der Ausführungsteil von main.py. Jeder Verzeichnisname wird aus dem Befehlszeilenargument abgerufen und ausgeführt.
Bisher habe ich aus PDF geschnitten, aber ich denke, es ist viel einfacher geworden. pyPDF2 und camelot hatten nur sehr wenige Kratzer und waren schwierig (-_-;) Es scheint, dass es noch einige Verbesserungen bei der Tabellenextraktion gibt, aber es scheint schwierig zu extrahieren, da dies auf die Struktur und den Schreibstil von PDF zurückzuführen ist. Dieser Code wird unter der Annahme erstellt, dass das exportierte PDF verwendet wird. Bitte beachten Sie, dass wir nicht getestet haben, ob das mit Adobe Scan usw. gescannte PDF-Handbuch angewendet werden kann.
Recommended Posts