title: Python - Fetch URL, parse and print PDF
body: <p>I'm trying to fetch the HTML source of a URL, parse it and then print the result as PDF. </p>
  
  <p>For that I wanted to rely on BeautifulSoup, urllib2 and reportlab but I lack on how to combine them properly. </p>
  
  <p>As an error I get <code>'module' object is not callable</code> when running the django 1.3.1 dev server and accessing the view.</p>
  
  <p>This is my code:</p>
  
  <pre><code>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))
  </code></pre>