pyPDF слияние и отображение в виде httpresponse через django - PullRequest
3 голосов
/ 19 августа 2011

У меня проблемы с включением логики pyPDF для объединения двух PDF-файлов с моим сайтом django.Я написал код, который работает для объединения файлов при запуске в файле python на локальном сервере (но мне нужно явно указать, какие файлы объединять:

from pyPdf import PdfFileReader, PdfFileWriter

output = PdfFileWriter()
input1 = PdfFileReader(file("abc_form0.pdf", "rb"))
input2 = PdfFileReader(file("abc_form1.pdf", "rb"))
total_pages = input1.getNumPages()
total_pages1 = input2.getNumPages()

for page in xrange(total_pages):
    output.addPage(input1.getPage(page))

for page in xrange(total_pages1):
    output.addPage(input2.getPage(page))


outputStream = file("output.pdf", "wb")
output.write(outputStream)
outputStream.close()

Этот код (с моего сайта django) работает дляотображать один PDF-файл. Однако, когда выбрано более одного PDF-файла, отображается только последний выбранный PDF-файл, следовательно, необходимо интегрировать pyPDF для создания одного файла, содержащего все запрошенные файлы.с поиском способа объединить эти два метода. Я пробовал следующее, но получаю ошибку ввода-вывода [Errno 2] Нет такого файла или каталога: 'obj.form'. Поэтому он не читает в obj.form - IМне нужно найти способ, чтобы он правильно читал эти объекты. В любом случае, это то, что я пробовал.

def create_pdf(self, request, queryset):
    response = HttpResponse(mimetype="application/pdf")
    response['Content-Disposition'] = 'attachment; filename=form.pdf'
    for obj in queryset:
        output = PdfFileWriter()
        input = PdfFileReader(file("obj.form","rb"))
        total_pages = input.getNumPages()
        for page in xrange(total_pages):
            output.addPage(input.GetPage(page))
        outputStream = file("output.pdf", "wb")
        response.write(outputStream)
        outputStream.close()
        ABC.objects.filter(pk=obj.pk).update(user=request.user,pdf_printed="1",request_time=time.strftime("%H:%M:%S"),request_date=datetime.datetime.today())
        return response

def print_selected_pdf(self, request, queryset):
    # prints the pdfs for those that are selected,
    # regardless if the pdf_printed field is true or false
    qs = queryset.filter(pdf_printed__exact=0)
    return self.create_pdf(request, qs)

Как всегда, спасибо за любую помощь или советы, которые вы можете предоставить!

Ответы [ 2 ]

5 голосов
/ 03 августа 2012

Я использовал stringIO в потоке вывода, чтобы обойти это.Я также должен был определить каждую страницу формы PDF, которая будет добавлена ​​к выводу.Это работает для итераций для любого количества форм, которые мне нужно запросить.

def create_form(self, request, queryset):
    response = HttpResponse(mimetype="application/pdf")
    response['Content-Disposition'] = 'attachment; filename=form.pdf'
    output = PdfFileWriter()
    for obj in queryset:
        input = PdfFileReader(cStringIO.StringIO(obj.form))
        output.addPage(input.getPage(0))
        output.addPage(input.getPage(1))
        output.addPage(input.getPage(2))
        output.addPage(input.getPage(3))
        ABC_Self.objects.filter(pk=obj.pk).update(user=request.user,pdf_printed="1",request_time=time.strftime("%H:%M:%S"),request_date=datetime.datetime.today())
    outputStream = cStringIO.StringIO()
    output.write(outputStream)
    response.write(outputStream.getvalue())
    return response
0 голосов
/ 07 ноября 2011

Все, что вам нужно сделать, это указать полный абсолютный путь к вашим PDF-файлам, например,

/home/joseph/form.pdf

или

c:/home/joseph/form.pdf

и т.д.

...