Генерация PDF на Python Python 17.02.2011

python_pdf.png Для создания pdf-файла из html-шаблона на python есть замечательный пакет pisa. Для его использования нужно сначала установить все зависимости

pip install pil html5lib pyPDF reportlab

Установим сам пакет

pip install pisa

Для примера работы понадобиться какой-то шаблонизатор, который на выходе будет выдавать готовый html, я использовал стандартный django'вский. Заготовка шаблона для будущего pdf может выглядит так

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>{{ article.title }}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<style type="text/css">
    @page { size: A4; margin: 1cm; }
    @font-face { font-family: Arial; src: url({{MEDIA_ROOT}}/fonts/arial.ttf); }
    body { font-size: 14px; line-height: 1em; font-family: Arial; }    
    a { color: #FB9925; }
    h3 { font-weight: bold; font-size: 18px; }
</style>
</head>
<body>

<img src="{{MEDIA_ROOT}}/img/logo.png" width="170" height="105" alt="logo" />

<h3>{{ article.date|date:"d.m.Y" }}. {{ article.title }}</h3>

<div>{{ article.text|safe }}</div>

</body>
</html>

Теперь напишем код, который будет отвечать за наполнение pdf нужным контентом. Для начала напишем функцию, которая будет собирать все в кучу

def render_to_pdf(template_src, context_dict):
    template = get_template(template_src)
    context = Context(context_dict)
    html  = template.render(context)
    result = StringIO.StringIO()
    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode('utf-8')), result, show_error_as_pdf=True, encoding='UTF-8')
    if not pdf.err:
        return result.getvalue()
    return False

Пример использования

pdf = render_to_pdf('article_pdf.html', {
    'article': article,
    'MEDIA_ROOT': settings.MEDIA_ROOT, 
})

if pdf:
    pdf_file = open("%s/%s.pdf" % (settings.ARTICLE_PDF_PATH, article.slug), 'w').write(pdf)

Внешний вид будущего pdf-файла описывается с помощью css: можно задать поля, размер листа (A0-A4, letter). В самом шаблоне можно определить места для нумерации страниц, содержания с помощью встроенных тегов. Подробности читаем тут.

Утилита wkhtmltopdf

Сама идея хранить "подшивку" по какой-то тематике в виде одного pdf-файла, а не набор html/css/images, мне понравилась. Нашел консольную утилиту wkhtmltopdf, которая умеет генерить pdf по заданному URL

Установка под Ubuntu

sudo apt-get install wkhtmltopdf

Использование

wkhtmltopdf http://ru.wikipedia.org/wiki/Python wiki_python.pdf

Утилита pdftk

Утилита pdftk позволяет работать с pdf файлами в консоли.

Установка под Ubuntu

sudo apt-get install pdftk

Извлечение страниц 5-7 с in.pdf в out.pdf

pdftk A=in.pdf cat A5-7 output out.pdf

Объединение файлов in1.pdf, in2.pdf в out.pdf

pdftk in1.pdf in2.pdf cat output out.pdf

Утилита qpdf

Утилита qpdf умеет снимать шифрование и защиту с pdf файлов

# установка
sudo apt-get install qpdf

# снятие защиты с pdf файла
qpdf --decrypt protectedpdf.pdf output.pdf

Еще одна утилита pdfcrack.

Утилита convert (ImageMagick)

Создание превьюшки первой страницы pdf-файла, высота изображения 80 px, ширина подбираться автоматически.

convert -thumbnail x80 file.pdf[0] thumb.png

Конвертирование набора tif в pdf

convert -compress zip *.tif book.pdf

Дополнительное чтиво

Цитата
Не следует быть слишком самонадеянным. Все кладбища забиты людьми, которые верили в то, что их некому заменить.
Р.Желязны
Категории
Архив