Обходной путь лимита PyPDF3 слияния - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь объединить более 1000 страниц PDF, и он работает с менее чем 750 страницами.Если я открываю более 750, он обрабатывает его, но выходной файл имеет размер 0 байт.

 from PyPDF3 import PdfFileWriter, PdfFileReader, PdfFileMerger
 import os
 import sys
 from collections import OrderedDict
 import win32file

 win32file._setmaxstdio(8192)

 print(win32file._getmaxstdio())

 sys.setrecursionlimit(30000)

 nameOfFile = os.path.basename(os.getcwd())

 #get page number
 def getPageNr(arg1):
    stro = str(arg1)
    stro=stro.replace('.pdf', '')
    listR = stro.split(' - ')
    listR[len(listR)-1] = listR[len(listR)-1].replace('-','')
    listR[len(listR)-1] = listR[len(listR)-1].replace('Page ','')
    pgNr=int(listR[len(listR)-1])
    return pgNr

currentFolder = os.getcwd()

pdffiles = [os.path.join(name)
             for root, dirs, files in os.walk(currentFolder)
             for name in files
             if name.endswith((".pdf"))]

#create dictionary and get whole list
di={}

#direct copy and create key from page number on back and value is original list
for string in pdffiles:
    di.setdefault(getPageNr(string),str(string))

#sort it by keys
di2 = OrderedDict(sorted(di.items()))

pdffiles.clear()

for key,values in di2.items():
    pdffiles.append(values) 

#put a correction 
pageAt = 0
adder = 421
pageAt = pageAt + adder

#add global variables for page in bookmark
mainTitlePage = 0
secondTitlePage = 0
thirdTitlePage = 0

#define globals for bookmarks
mainTitle = ''
SecondTitle = ''
thirdTitle = ''

#define previous bookmarks
lastMainTitle = ''
lastSecondTitle = ''
lastThirdTitle = ''

#if main title is same as next page
isSame = True

#start Merger
editer = PdfFileMerger()

#start main loop
while pageAt<(adder+2000) and pageAt<len(pdffiles) and isSame:

    #break filename to titles
    titles = pdffiles[pageAt].split(' - ')

    #break next page for titles
    titlesNext = pdffiles[pageAt+1].split(' - ')

    #get titles
    mainTitle = titles[0]
    secondTitle = titles[1]

    if not titlesNext[0] == mainTitle:
        isSame = False

    hasThird = False
    if len(titles)>4:
        thirdTitle = titles[2]
        hasThird = True

    else:
        thirdTitle = None
        hasThird = False

    #open individual page
    kStream = open(pdffiles[pageAt], 'rb')  
    inputK = PdfFileReader(kStream)

    #test if titles are changing
    if not mainTitle == lastMainTitle:
        KmainParent = editer.addBookmark(mainTitle, 0) 

    if not secondTitle == lastSecondTitle:
        secondTitlePage = pageAt-adder
        #print(secondTitle)
        Kparent = editer.addBookmark(secondTitle, secondTitlePage, KmainParent)

    if hasThird:    
        if not thirdTitle == lastThirdTitle:
            thirdTitlePage = pageAt-adder
            Mparent = editer.addBookmark(thirdTitle, thirdTitlePage, Kparent)   

        editer.addBookmark(titles[3], pageAt-adder, Mparent)
    else:
        editer.addBookmark(titles[2], pageAt-adder, Kparent)

    #merge page with fixed bookmarks
    editer.merge((pageAt - adder), inputK)

 #get titles and save them for future 
    lastMainTitle = mainTitle
    lastSecondTitle = secondTitle
    lastThirdTitle = thirdTitle

    #go to next page
    pageAt += 1

#get name for output file
nameOfFile = mainTitle + '.pdf'
print('Saving ' + nameOfFile)

#start new file and export it 
outR = open(nameOfFile, 'wb')
editer.write(outR)      

outR.close()
kStream.close()

Теперь он помещает все закладки, никаких проблем там нет.Но как обработать более 750 страниц.Я увеличил предел рекурсии и maxstdio ... но если есть 1000 или более страниц, объединенный файл равен 0 байтам, но процесс занимает минуту или две, поэтому он обрабатывает.

Я не получаю никаких ошибок.

Может ли кто-нибудь помочь мне обработать более 500 страниц

...