Python - получение URL, анализ и печать PDF - PullRequest
2 голосов
/ 24 марта 2012

Я пытаюсь получить HTML-источник URL-адреса, проанализировать его и затем распечатать результат в формате PDF.

Для этого я хотел положиться на BeautifulSoup, urllib2 и reportlab, но мне не хватает того, как правильно их комбинировать.

В качестве ошибки я получаю 'module' object is not callable при запуске сервера django 1.3.1 dev и доступе к представлению.

Это мой код:

from reportlab.pdfgen import canvas
from cStringIO import StringIO
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext
# Fetching the URL
import urllib2

# Parsing the HTML
from BeautifulSoup import BeautifulSoup

# The ConverterForm
from django import forms

class ConverterForm(forms.Form):
    # Use textarea instead the default TextInput.
    html_files = forms.CharField(widget=forms.Textarea)
    filename = forms.CharField()

# Create your views here.
def create_pdf(request):
    # If the form has been submitted
    if request.method == 'POST':
        # A form bound to the POST data
        form = ConverterForm(request.POST)
    # All validation rules pass
    if form.is_valid():
        # PDF creation process
        # Assign variables
        html_files = form.cleaned_data['html_files']
        filename = form.cleaned_data['filename']

        # Create the HttpResponse object with the appropriate PDF headers.
        response = HttpResponse(mimetype='application/pdf')
        # The use of attachment forces the Save as dialog to open.
        response['Content-Disposition'] = 'attachment; filename=%s.pdf' % filename

        buffer = StringIO()

        # Get the page source
        page = urllib2.urlopen(html_files)
        html = page.read()

        # Parse the page source
        soup = BeautifulSoup(html)

        # Create the PDF object, using the StringIO() object as its "file".
        p = canvas.Canvas(buffer)

        # Draw things on the PDF and generate the PDF.
        # See ReportLab documentation for full list of functions.
        p.drawString(100, 100, soup)

        # Close the PDF object cleanly.
        p.showPage()
        p.save()

        # Get the value of the StringIO buffer and write it to the response.
        pdf = buffer.getvalue()
        buffer.close()
        response.write(pdf)
        return response

    else:
        # An unbound form
        form = ConverterForm()

    # For RequestContext in relation to csrf see more here:
    # https://docs.djangoproject.com/en/1.3/intro/tutorial04/
    return render_to_response('converter/index.html', {
    'form': form,
    }, context_instance=RequestContext(request))

Ответы [ 2 ]

4 голосов
/ 24 марта 2012

Вам необходимо импортировать BeautifulSoup class:

from BeautifulSoup import BeautifulSoup

Это может сбить с толку, потому что и модуль, и класс имеют одинаковое базовое имя.

1 голос
/ 24 марта 2012

Вот более простой способ:

import cStringIO as StringIO

import ho.pisa as pisa
import requests

def pdf_maker(request):

    browser = requests.get('http://www.google.com/')
    html = browser.text

    result = StringIO.StringIO()
    source = StringIO.StringIO(html.encode('UTF-8')) # adjust as required

    pdf = pisa.pisaDocument(source,dest=result)

    if not pdf.err:
        response = HttpResponse(result.getvalue(),mimetype='application/pdf')
        response['Content-Disposition'] = 'attachment; filename=the_file.pdf'
        return response

    return render(request,'error.html')

Используются запросы и Пиза . Тем не менее, вы будете иметь некоторые ограничения с этим (и другие подобные решения). А именно, вам нужно будет найти способ извлекать и вставлять изображения самостоятельно, поскольку процесс преобразования PDF не может загружать изображения непосредственно из Интернета.

...