I'm using regular expressions to extract students' IDs from one large PDF file and save the associated's student page in a separate (one) PDF file. I've used this program for quite some time, however, I'm facing this problem where sometimes two pages may be associated with one student's ID. So, I have to combine two pages in one PDF file.
I created two lists, one for page numbers and one for students' IDs. As you can see below in the std_ID list, two IDs (index 2 and 3) are repeated, which means that pages numbered 2 and 3 must be combined separately resulting in a total of 4 pdf files.
pagesNumber = [0, 1, 2, 3, 4]
std_ID = ['331401142', '439233718', '440113239', '440113239', '440113245']
A snippet of the code I'm currently using would yield 4 pdf files where index 2's page is totally ignored resulting in 440113239.pdf will have only index 3's page. Can somebody help?
def split(self, folder):
# file_base_name = self.pdf.replace('pdf', '')
output_folder_path = os.path.join(os.getcwd(), folder)
for page, ID in zip(pagesNumber ,std_ID ):
pdfWriter = PdfFileWriter()
pdfWriter.addPage(reader.getPage(page))
with open(os.path.join(output_folder_path, '{0}.pdf'.format(ID)), 'wb') as f:
pdfWriter.write(f)
f.close()
Full code:
from PyPDF2 import PdfFileReader, PdfFileWriter
from time import time
import re, os
class Extract_Lab:
global folder_Path, std_ID , pageNumber
folder_name = "Rayat_Data\RAYAT_FILES"
folder_Path = os.path.join(os.getcwd(), folder_name)
pageNumber = []
std_ID = []
def __init__(self, pattern, pdf):
self.pattern = pattern
self.pdf = pdf
def run(self):
file = open(fr"{folder_Path}\{self.pdf}.pdf", 'rb')
global reader
reader = PdfFileReader(file)
for page in range(reader.numPages):
sevPage = reader.getPage(page)
pdfData = str(sevPage.extractText())
match = re.findall(self.pattern,pdfData)
for m in match:
std_ID.append(m)
pageNumber.append(page)
return std_ID, pageNumber
def split(self, folder):
# file_base_name = self.pdf.replace('pdf', '')
output_folder_path = os.path.join(os.getcwd(), folder)
for page, ID in zip(pageNumber ,std_ID):
pdfWriter = PdfFileWriter()
pdfWriter.addPage(reader.getPage(page))
with open(os.path.join(output_folder_path, '{0}.pdf'.format(ID)), 'wb') as f:
pdfWriter.write(f)
f.close()
def main():
start = time()
itmatch = '((?!1750111)[1|2|3|4]\d{8})'
file_pdf = "SS05"
obj = Extract_Lab(itmatch, file_pdf)
lab, page = obj.run()
obj.split(r"Rayat_Data\Trainees_Tables")
print(f'Time taken: {time() - start}')
if __name__ == '__main__':
main()