3

インターネットサイト(maya.tase.co.il)でリンクを解析し、PDFファイルをダウンロードして、それらをマージするスクリプトを書いています。ほとんどの場合は機能しますが、マージするとファイルに応じてさまざまな種類のエラーが発生します。理由がわからないようです。関連するコードを切り取り、問題を引き起こしている2つの特定のファイルに対してのみテストを作成しました。スクリプトは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()

これを読むのに時間を割いてくれた人に感謝します。アル。

4

2 に答える 2

1

私はかつて複雑な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

その後、それは魅力のように機能します。それが役に立てば幸い。

于 2011-07-18T18:36:35.713 に答える
0

pyPdfを使用してドキュメントを試しました。このドキュメントの両方のPDFが暗号化されているようで、空白のパスワード( "")は無効です。

adobeのセキュリティ設定を見ると、印刷とコピーが許可されていますが、pyPdfのinput.decrypt( "")を実行すると、ファイルは暗号化されたままになります(たとえば、input.getNumPages()は0を返します。 )。

これをOSXのプレビューで開き、暗号化せずにPDFを保存すると、アセンブリは正常に機能します。ただし、pyPdfはページを扱うので、pyPdfを介してこれを行うことはできないと思います。正しいパスワードを見つけるか、OpenOfficeへのバッチジョブを使用するなど、別のアプリケーションを使用するか、別のpdfプラグインが機能します。

セキュリティ設定

于 2011-07-19T15:41:44.923 に答える