Сегодня мы посмотрим на простую библиотеку для создания PDF, которая называется pyfpdf и является портом библиотеки FPDF для PHP. Она не может заменить Reportlab, но даёт Вам более чем простую возможность создавать PDF файлы. Давайте на неё посмотрим.
Установка pyfpdf
К сожалению, у этого пакета не setup.py или eggs, что облегчило бы нам его установку. Вместо этого Вам придётся скачать его, разархивировать и скопировать получившуюся папку в папку site-packages. Последняя версия создаёт папку pyfpdf-1.54b, так что Вам придётся переименовать её в pyfpdf, если Вы хотите использовать примеры из их руководства или из этой статьи. Кроме того, Вы можете просто скопировать его в virtualenv.
Тест-драйв pyfpdf
Как и при знакомстве с любой новой библиотекой, для того, чтобы понять, как она работает, Вам надо написать несколько примеров. Вот простейший код, с помощью которого Вы можете создать PDF:
import pyfpdf
pdf = pyfpdf.FPDF(format='letter')
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Welcome to Python!", align="C")
pdf.output("tutorial.pdf")
Обратите внимание, что когда Вы инициализируете ваш FPDF объект, Вы должны сообщить ему, что хотите, чтобы результат был с размером "letter". По умолчанию его значение "A4". Далее мы должны добавить страницу, задать шрифт и поместить туда какой-нибудь текст. Вызов pdf.cell немного не очевиден. Первые два аргумента - ширина и высота и определяет место, где будет располагаться ваш текст. Параметр align принимает в качестве значения один символ. В нашем случае мы центрируем текст, передавая символ "С". Последняя строка принимает два параметра - имя файла и путь. Если путь не задан, то файл будет располагаться в рабочей папке скрипта.
А что, если мы хотим добавить ещё одну строку? Это можно сделать, добавляя текст в конец файла, добавив ещё одну "ячейку". Если Вам нужен разрыв строки - можно использовать такой код:
import pyfpdf
pdf = pyfpdf.FPDF(format='letter')
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
pdf.cell(200,10,'Powered by FPDF',0,1,'C')
pdf.output("tutorial.pdf")
Добавляем Цацки: заголовки, нижние колонтитулы и разрывы страниц
В руководстве показано, как можно добавить заголовок, нижний колонтитул и разрыв страниц. Но этот способ не работает, так как надо изменить имя метода и код надо переписать, используя this вместо self (не знаю о чём он - прим. пер.). Вот что должно быть в идеале:
import pyfpdf ######################################################################## class MyPDF(pyfpdf.FPDF): """""" #---------------------------------------------------------------------- def header(self): """ Заголовок на каждой странице """ # добавляем логотип self.image("logo.png", x=10, y=8, w=23) # располагаем логотип справа self.cell(w=80) # устанавливаем шрифт для заголовка, B=Bold self.set_font("Arial", style="B", size=15) # заголовок страницы self.cell(40,10, "Python Rules!", border=1, ln=0, align="C") # вставляем разрыв строки в 20 pixels self.ln(20) #---------------------------------------------------------------------- def footer(self): """ Нижний колонтитул на каждой странице """ # располагаем footer в 15mm от конца страницы self.set_y(-15) # устанавливаем шрифт, I=italic self.set_font("Arial", style="I", size=8) # отображаем номер страницы по центру pageNum = "Page %s/{nb}" % self.page_no() self.cell(0, 10, pageNum, align="C") #---------------------------------------------------------------------- if __name__ == "__main__": pdf = MyPDF() pdf.alias_nb_pages() pdf.add_page() pdf.set_font("Times", size=12) # добавляем несколько строк на страницу for i in range(1, 50): pdf.cell(0, 10, "Line number %s" % i, border=0, ln=1) pdf.output("tutorial2.pdf")
Итак, мы создали подкласс FPDF, переопределили его методы header и footer, так как в оригинальном классе они всего лишь заглушки. В нашем заголовке мы создаём объект изображения и задаём его координаты х/у и его ширину w. Кроме того, вы можете передать и его высоту, если Вас беспокоит соотношение сторон. После этого мы его позиционируем и добавляем строку текста для заголовка. Наконец, мы добавляем разрыв строки.
Footer мы помещаем на 15 мм выше конца страницы. Его шрифт - 8pt Arial Italic. Ошибка в официальном руководстве была в том, что он вызывал self.PageNo(), который не существует. Зато есть метод page_no, который, видимо, его заменяет, так что я его и использовал. Наконец, в конце скрипта мы создаём наш PDF объект и записываем в него несколько строк. Если Вы запустите этот скрипт, Вы получите 3-х страничный документ.
Подведение итогов
В руководстве говорится так же об использовании цветов, но это я оставлю Вам в качестве домашнего задания. Ничего по поводу рисования, вставки таблиц или графиков, встраивания собственных шрифтов и многих других вещей, доступных в Reportlab, я не нашёл, но, опять же, это и предполагалось в качестве простой библиотеки для создания PDF. Если Вам нужны более продвинутые инструменты - смотрите в сторону Reportlab или проектов, созданных на его основе (rst2pds или xhtml2pdf).
никак не удается сделать вывод кириллицы в pdf
ОтветитьУдалитьесть какие-то решения?
я пока для своих целей pdf не пользовался, так что не в курсе. если найду и вспомню о вопросе - напиш
Удалитьа Вы под второй версией питона пробуете или под третьей?
Удалитьа Вы под второй версией питона пробуете или под третьей?
ОтветитьУдалитьВариант TeX--> pdf не пробовали рассматривать?
ОтветитьУдалить