объединение файлов PDF с pypdf - PullRequest
3 голосов
/ 18 июля 2011

Я пишу скрипт, который анализирует интернет-сайт (maya.tase.co.il) для ссылок, загружает 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.

Ответы [ 2 ]

1 голос
/ 18 июля 2011

Однажды я написал сложный материал для генерации / слияния 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 голосов
/ 19 июля 2011

Я пробовал документы с pyPdf - похоже, что оба файла pdf в этом документе зашифрованы, а пустой пароль ("") недействителен.

Глядя на настройки безопасности в Adobe, вы 'Разрешено печатать и копировать - однако, когда вы запускаете pyPdf input.decrypt (""), файлы по-прежнему шифруются (как в input.getNumPages () после того, как это все еще возвращает 0).возможность открыть это в предварительном просмотре OSX и сохранить PDF-файлы без шифрования, а затем сборка работает нормально.pyPdf работает на страницах, поэтому я не думаю, что вы можете сделать это через pyPdf.Либо найдите правильный пароль, либо воспользуйтесь другим приложением, например, используйте пакетное задание для OpenOffice, или другой плагин pdf будет работать.

Security Settings

...