You are currently viewing the new Anvil Editor Docs.
Switch to the Classic Editor Docs
You are currently viewing the Classic Editor Docs.
Switch to the new Anvil Editor Docs

Creating PDFs

Anvil Forms can be converted to PDFs with a single function call. You might do this in order to attach a PDF to an email, print a PDF, or allow your users to download a PDF.

Converting a Form to a PDF

You can convert Forms to PDFs by calling anvil.pdf.render_form() in server code. Pass in the name of the Form you wish to print as a string. If the Form takes any arguments to its __init__ method, you can pass these in as extra arguments to render_form() (this is exactly like calling open_form()):

# In server code

import anvil.pdf

@anvil.server.callable
def create_zaphod_pdf():
  media_object = anvil.pdf.render_form('Form1', 42, name='Zaphod')
  return media_object

The return value of render_form() is a Media object. This means you can download it in client code:

   # In client code
   import anvil.media

   def download_zaphod_pdf(self):
     media_object = anvil.server.call('create_zaphod_pdf')
     anvil.media.download(media_object)

You can attach it to an email:

@anvil.server.callable
def send_pdf_email():
  anvil.email.send(
    from_name="The Zaphod Generator", 
    to="shaun@anvil.works", 
    subject="An auto-generated Zaphod",
    text="Your auto-generated Zaphod is attached to this email as a PDF.",
    attachments=anvil.pdf.render_form('Form1', 42, name='Zaphod')
  )

You can also store it in a Data Table:

app_tables.my_pdfs.add_row(
  added=datetime.now(),
  owner=anvil.users.get_user(),
  pdf=anvil.pdf.render_form('Form1', 42, name='Zaphod'),
)

You could store it in Google Drive too. Anything you can do with a Media Object, you can do with your PDF file!

Customising settings

You can adjust the image quality, page settings, margins or generated filename for your PDF by instantiating a PDFRenderer(), and calling its render_form() method:

  from anvil.pdf import PDFRenderer

  pdf = PDFRenderer(page_size='A4').render_form('Form1')

You may specify the following arguments to the PDFRenderer() constructor:

  • filename (string): The name of the generated PDF file. (Default: "print.pdf").

  • landscape (True or False): Generate a PDF in landscape orientation. (Default: False).

  • page_size (string or tuple): Can be the name of a standard page size ("letter" or "A0"-"A10"), or a tuple of (width, height) in centimetres. (Default: "letter").

  • margins (dict or number): Page margins (in centimetres), as a dictionary specifying margins on each side (eg {'top': 1.0, 'bottom': 1.0, 'left': 1.0, 'right': 1.0}) or as a number specifying a global margin. (Default 1.0).

  • scale (number): The scale (zoom level) at which you are printing. (Default 1.0).

  • quality (string): The quality of the generated PDF, which has a large impact on file size (Default "default"). Available values are:

    • "original": All images will be embedded at original resolution. Output file can be very large.
    • "screen": Low-resolution output similar to the Acrobat Distiller “Screen Optimized” setting.
    • "printer": Output similar to the Acrobat Distiller “Print Optimized” setting.
    • "prepress": Output similar to Acrobat Distiller “Prepress Optimized” setting.
    • "default": Output intended to be useful across a wide variety of uses, possibly at the expense of a larger output file.

Do you still have questions?

Our Community Forum is full of helpful information and Anvil experts.