2016-08-30 23 views
0

PyPDF2에서 PdfFileMerger()를 사용하여 pdf 파일을 병합하려고합니다 (코드 참조).pypdf2에서 PdfFileMerger()를 사용한 후의 페이지 수

from PyPDF2 import PdfFileMerger, PdfFileReader 

[...] 

merger = PdfFileMerger() 

if (some condition): 
    merger.append(PdfFileReader(file(filename1, 'rb'))) 
    merger.append(PdfFileReader(file(filename2, 'rb'))) 
if (test for non-zero file size): 
    merger.write("output.pdf") 

그러나 내 병합 명령에는 특정 조건이 적용되며 병합 된 pdf 파일이 생성되지 않을 수 있습니다. PdfFileMerger()를 사용하여 병합을 수행 한 후 페이지 수를 결정하는 방법을 알고 싶습니다. 아무것도 아닌 경우 페이지 수가 영 (0)이 아닌지 알고 싶습니다. 이렇게하기위한 카운터를 유지하는 것은 여러 기능에 걸쳐 병합을 수행하고보다 우아한 솔루션을 선호하기 때문에 번거로울 수 있습니다.

+0

어쩌면 페이지 수를 유지하여 합병 객체 래퍼를 만들고 주위에 있음을 전달합니다. –

+0

네, 그 옵션입니다. PdfFileWriter와는 달리, PdfFileMerger는 getNumPages()와 같은 메소드를 갖고있는 것처럼 보이지 않으며이 기능을 구현하기 위해 래퍼 객체를 만들어야하는 것처럼 보입니다. – arbitguy

답변

1

안녕하세요 - 나와 같은 경우입니다. 나는 나의 해결책을 설명 할 것이다. 내가 PdfFileReader('filename.pdf', 'rb')와 함께 pdfs를 열지는 않지만 병합 (pdfs_content_array)을위한 배열에 pdfs 컨텐트를 전달하고 있습니다. 그런 다음 합병과 출력을 준비 중입니다 (생성 된 파일을 로컬에 저장하지 말고 병합 된 컨텐츠를 어딘가에 저장해야합니다.) 페이지 번호 결과를 비교하려면 calc_page_sum이 필요합니다. 가장 중요한 부분은 다음과 같습니다. calc_page_sum += PdfFileReader(bytes_content).getNumPages() 그래서 PdfFileReader로 바이트 내용을 열고 페이지 번호를 가져옵니다. 그런 다음 합병을 추가 할 것입니다. ... merger.append,bytes_content merge를 내 바이트 출력에 쓰고 calc_page_sum과 비교합니다. 그게 전부 야.

from PyPDF2 import PdfFileMerger, PdfFileReader 
import io 

[...] 

def merge_the_pdfs(self,pdfs_content_array,output_file): 
    merger = PdfFileMerger() 
    output = io.BytesIO() 
    calc_page_sum = 0 

    for content in pdfs_content_array: 
     bytes_content = io.BytesIO(content) 
     calc_page_sum += PdfFileReader(bytes_content).getNumPages() 
     yield self.application.cpupool.submit(merger.append,bytes_content) 

    merger.write(output) 
    if not calc_page_sum == PdfFileReader(output).getNumPages(): 
     return None 

    return output.getValue() 

희망이 도움이 될 것입니다!

2 버전 :

from PyPDF2 import PdfFileMerger, PdfFileReader 
import io 
import sys 

filename1 = 'test.pdf' 
filename2 = 'test1.pdf' 

merger = PdfFileMerger() 
output = io.BytesIO() 
calc_page_sum = 0 

filesarray = [filename1,filename2] 

for singlefile in filesarray: 
    calc_page_sum += PdfFileReader(singlefile, 'rb').getNumPages() 
    merger.append(PdfFileReader(singlefile, 'rb')) 

merger.write(output) 
print(calc_page_sum) 
print(PdfFileReader(output).getNumPages()) 

if calc_page_sum == PdfFileReader(output).getNumPages(): 
    print("It worked") 
    merger.write("merging-test.pdf") 
    sys.exit() 

print("Didn't worked") 
sys.exit() 
+0

내 질문에 언급했듯이, 나는 (calc_page_sum 같은) 카운터를 유지하면 문제를 해결할 수 있다는 데 동의한다. 그러나 더 나은 솔루션이 있는지 궁금합니다. 예를 들어 PdfFileMerger를 사용하기 전에 PdfFileWriter를 사용했습니다. PdfFileWriter에는 문제를 해결하는 getNumPages() 메소드가 있습니다. 그러나 PdfFileWriter 너무 많은 파일을 열 때 및 PdfFileMerger, getNumPages() 같은 메서드를 사용할 수없는 이동했을 때 문제가 발생했습니다. – arbitguy

+0

다른 옵션을 찾지 못했습니다. 파일'merger.write ("output.pdf")에 쓰기 대신에 결과를 BytesIO 객체에 쓰고 PdfFileWriter를 사용하여 getNumPages()를 사용하여 비교할 수 있습니다. 이것이 사실이라면 출력을 다시 쓰지 만 파일에 쓸 수 있습니다. –