簡體   English   中英

如何使用 Python 拆分 PDF,每個頁面都包含一組特定的唯一文本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM