Для создания 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
Дополнительное чтиво