2011-07-18 144 views
3

我正在寫一個腳本,解析一個互聯網網站(maya.tase.co.il)的鏈接,下載PDF文件併合並它們。它主要工作,但根據文件的不同,合併會帶來不同類型的錯誤。我似乎無法弄清楚爲什麼。我刪掉了相關的代碼,並且只針對導致問題的兩個特定文件構建了一個測試。腳本使用pypdf,但我願意嘗試任何可行的方法。有些文件是加密的,有些則不是。合併PDF文件與pypdf

def is_incry(pdf): 
    from pyPdf import PdfFileWriter, PdfFileReader 
    input=PdfFileReader(pdf) 
    try: 
     input.getNumPages() 
     return input 
    except: 
     input.decrypt("") 
     return input 

def merg_pdf(to_keep,to_lose): 
    import os 
    from pyPdf import PdfFileWriter, PdfFileReader 
    if os.path.exists(to_keep): 
     in1=file(to_keep, "rb") 
     in2=file(to_lose, "rb") 
     input1 = is_incry(in1) 
     input2 = is_incry(in2) 
     output = PdfFileWriter() 
     loop1=input1.getNumPages() 
     for i in range(0,loop1): 
      output.addPage(input1.getPage(i))#    
     loop2=input2.getNumPages() 
     for i in range(0,loop2): 
      output.addPage(input2.getPage(i))# 
     outputStream = file("document-output.pdf", "wb") 
     output.write(outputStream) 
     outputStream.close() 
     pdflen=loop1+loop2 
     in1.close() 
     in2.close() 
     os.remove(to_lose) 
     os.remove(to_keep) 
     os.rename("document-output.pdf",to_keep) 
    else: 
     os.rename(to_lose,to_keep) 
     in1=file(to_keep, "rb") 
     input1 = PdfFileReader(in1) 
     try: 
      pdflen=input1.getNumPages() 
     except: 
      input1.decrypt("") 
      pdflen=input1.getNumPages() 
     in1.close() 
     #input1.close() 
    return pdflen 


def test(): 
    import urllib 
    urllib.urlretrieve ('http://mayafiles.tase.co.il/RPdf/487001-488000/P487028-01.pdf', 'temp1.pdf') 
    urllib.urlretrieve ('http://mayafiles.tase.co.il/RPdf/488001-489000/P488170-00.pdf', 'temp2.pdf') 
    merg_pdf('temp1.pdf','temp2.pdf') 

test() 

我感謝任何人,甚至花時間閱讀本文。 Al。

+0

我只能看到的是,如果你不能寫你的默認目錄 - 你可能會指定的OutputStream =文件的完整路徑(「/ tmp目錄/ document.pdf」,「WB」) 。我和pypdf完全一樣,並沒有任何問題(儘管我不處理加密的pdf)。 –

+0

此腳本適用於大多數文件,但有些會給我錯誤。我不知道爲什麼第二個這裏不能合併。 – user850498

回答

0

我曾經寫過一個複雜的PDF生成/合併的東西,我現在已經開源了。

你可以看看它:https://github.com/becomingGuru/nikecup/blob/master/reg/models.py#L71

def merge_pdf(self): 
    from pyPdf import PdfFileReader,PdfFileWriter 

    pdf_file = file_names['main_pdf']%settings.MEDIA_ROOT 
    pdf_obj = PdfFileReader(open(pdf_file)) 

    values_page = PdfFileReader(open(self.make_pdf())).getPage(0) 

    mergepage = pdf_obj.pages[0] 
    mergepage.mergePage(values_page) 

    signed_pdf = PdfFileWriter() 
    for page in pdf_obj.pages: 
     signed_pdf.addPage(page) 

    signed_pdf_name = file_names['dl_done']%(settings.MEDIA_ROOT,self.phash) 
    signed_pdf_file = open(signed_pdf_name,mode='wb') 

    signed_pdf.write(signed_pdf_file) 
    signed_pdf_file.close() 
    return signed_pdf_name 

然後它的工作原理就像一個魅力。希望能幫助到你。

+0

我不確定如何使用它。你願意提供一些指導嗎? – user850498

0

我用pyPdf試過了文檔 - 看起來這個文檔中的兩個pdf都是加密的,並且空白密碼(「」)是無效的。

查看adobe中的安全設置,可以打印和複製 - 但是,當您運行pyPdf的input.decrypt(「」)時,文件仍然是加密的(如in.input.getNumPages()之後這仍然返回0)。

我能夠在OSX的預覽中打開這個文件,並保存沒有加密的pdf文件,然後程序集正常工作。 pyPdf雖然在頁面中處理,所以我不認爲你可以通過pyPdf做到這一點。要麼找到正確的密碼,要麼可能使用其他應用程序,例如使用批量作業到OpenOffice,或使用其他pdf插件。

Security Settings