[英]how to create a list of pdf page numbers if pdf page contains specific text strings using python
[英]How do I split a PDF using Python, every page that contains a set of specific unique text
我有一個大的 PDF 文件,需要將它拆分為每個“X”頁,但“X”可能會有所不同。 我需要它來拆分每個頁面,其中頁面包含文本“名稱:”,但“名稱:”之后的文本發生變化......
所以第 1 頁可能有“姓名:Sachin”,那么第 2 頁也可能有“姓名:Sachin”,但第 3 頁有“姓名:Sarah”,所以它應該從第 1 頁拆分到第 2 頁,然后是第 3 頁。
這是我找到的一個腳本,除了它在每一頁上都分開,無論如何。
https://www.blog.pythonlibrary.org/2018/04/11/splitting-and-merging-pdfs-with-python/
提前致謝,
薩欽
更新:
這是一些無論如何都拆分每個頁面的代碼,但它會在找到文本“名稱:”后檢測名稱並相應地重命名拆分文件,它在文件名中具有名稱。
我如何更新代碼,以便如果找到兩個具有相同名稱的連續頁面(在文本字段“名稱:”之后),它不會在該頁面上拆分,而是將兩個具有相同名稱的頁面合並為一個pdf 文件?
再次感謝,
薩欽
import os
import re
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_file_path = 'Payslips.pdf'
file_base_name = pdf_file_path.replace('.pdf', '')
output_folder_path = os.path.join(os.getcwd(), 'Output')
pdf = PdfFileReader(pdf_file_path)
for page_num in range(pdf.numPages):
# Setup Objects & Classes
pdfWriter = PdfFileWriter()
pageObj = pdf.getPage(page_num)
pdfWriter.addPage(pageObj)
# Extract Text
Text = pageObj.extractText()
# print(Text)
MatchedTextArray = re.findall("Name:[^0-9]+?\s", Text)
MatchedText = (MatchedTextArray[0].replace('Name:', '')).replace('\n', '')
# Splitting on UpperCase
res_pos = [i for i, e in enumerate(MatchedText+'A') if e.isupper()]
res_list = [MatchedText[res_pos[j]:res_pos[j + 1]]
for j in range(len(res_pos)-1)]
# Extracting Firstname
firstname = res_list[1]
# Extracting Surname
del res_list[0:2]
surname = ''.join(res_list)
with open(os.path.join(output_folder_path,
'{0}, {1} - {2}.pdf'.format(surname.upper(), firstname.upper(), file_base_name.upper())),
'wb') as f:
pdfWriter.write(f)
f.close()
print("Split Page " + str(page_num))
像這樣的東西應該工作:
import os
from PyPDF2 import PdfFileReader, PdfFileWriter
def pdf_splitter(path):
fname = os.path.splitext(os.path.basename(path))[0]
pdf = PdfFileReader(path)
for page in range(pdf.getNumPages()):
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf.getPage(page))
output_filename = '{}_page_{}.pdf'.format(
fname, page+1)
if not your_condition: # only write of condition isn't met (anymore)
with open("Give_it_a_name.txt", 'wb') as out:
pdf_writer.write(out)
print('Created: {}'.format("Give_it_a_name.txt"))
if __name__ == '__main__':
path = 'w9.pdf'
pdf_splitter(path)
好的,我想我解決了:
import os
import re
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_file_path = 'Payslips.pdf'
file_base_name = pdf_file_path.replace('.pdf', '')
output_folder_path = os.path.join(os.getcwd(), 'Output')
pdf = PdfFileReader(pdf_file_path)
# Split Files
count = 0
for page_num in range(pdf.numPages):
# Skip Parent Loop if needed
if count > 0:
count -= count
continue
# Setup Objects & Classes
pdfWriter = PdfFileWriter()
pageObj = pdf.getPage(page_num)
pdfWriter.addPage(pageObj)
# Search on Current Page
Text = pageObj.extractText()
MatchedTextArray = re.findall("Name:[^0-9]+?\s", Text)
MatchedText = (MatchedTextArray[0].replace('Name:', '')).replace('\n', '')
# Search on following Pages
i = page_num + 1
while i < pdf.numPages:
pageObjNext = pdf.getPage(i)
TextNext = pageObjNext.extractText()
MatchedTextArrayNext = re.findall("Name:[^0-9]+?\s", TextNext)
MatchedTextNext = (MatchedTextArrayNext[0].replace('Name:', '')).replace('\n', '')
if MatchedText == MatchedTextNext:
i += 1
count += 1
pdfWriter.addPage(pageObjNext)
else:
break
# Splitting on UpperCase
res_pos = [i for i, e in enumerate(MatchedText+'A') if e.isupper()]
res_list = [MatchedText[res_pos[j]:res_pos[j + 1]] for j in range(len(res_pos)-1)]
# Extracting Firstname
firstname = res_list[1]
# Extracting Surname
surname = ''
del res_list[0:2]
if len(res_list) == 1:
surname = surname + res_list[0]
else:
surname = surname + res_list[0]
for i in (n+1 for n in range(len(res_list)-1)):
if res_list[i-1][-1] == "-" or res_list[i-1][-1] == "'" :
surname = surname + res_list[i]
else:
surname = surname + " " + res_list[i]
# Write PDF File
with open(os.path.join(output_folder_path,
'{0}, {1}'.format(surname.upper(), firstname.upper())), 'wb') as f:
pdfWriter.write(f)
f.close()
# Rename Files in Output Directory
files = os.listdir(output_folder_path)
for file in files:
os.rename(os.path.join(output_folder_path, file),
os.path.join(output_folder_path, 'WE 25JAN 2022 - ' + file + ' - PAYSLIP' + '.pdf'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.