Django Persian PDF is a set of class based views allowing you to generate PDF reports using html or latex templates. Django Persian PDF under the hood uses two compiler to render template and build the actual pdf file:
- Xelatex
- Google Chrome
Using this approach avoids regular overhead for parsing html tags, improving overall response time and memory usage when generating large pdf files. Django Persian PDF follows django class based views and base on the compilers provide 4 generic view classes. The only difference is that these classes render their associated template and return a pdf file as response. Just like django views you can pass queryset or make context to be used in template. Here are the view classes available in django_persian_pdf:
HTMLToPDFTemplateViewis an extension of djangoTemplateViewusing.htmltemplate to generate pdf file.HTMLToPDFDetailViewis an extension of djangoDetailViewusing.htmltemplate to generate pdf file.LatexToPDFTemplateViewis an extension of djangoTemplateViewusing.textemplate to generate pdf file.LatexToPDFDetailViewis an extension of djangoDetailViewusing.textemplate to generate pdf file.
- Django >= 3.2
- Google Chrome Stable
- xelatex
pip install django-persian-pdf- Make sure you have installed either
google-chrome-stableortexlive-xetexon your machine.
sudo apt install google-chrome-stable
sudo apt install texlive-xetex- Edit settings.py and add django_persian_pdf to your INSTALLED_APPS.
- Inherit your views from appropriate Template or Detail view classes.
Example #1: Using HTML Template to generate a PDF response
from django_persian_pdf import views as pdf_views
class TemplatePrint(pdf_views.HTMLToPDFTemplateView):
template_name = 'payment_reports.html'
def get_context_data(self, **kwargs):
context = super().get_context_data()
context['payments'] = Payments.objects.all()
return context
class DetailPrint(pdf_views.HTMLToPDFDetailView):
template_name = 'payment_detail.html'
queryset = Payments.objects.all()Example #2: Using LaTeX Template to generate a PDF response
from django_persian_pdf import views as pdf_views
class TemplatePrint(pdf_views.LatexToPDFTemplateView):
template_name = 'payment_reports.tex'
def get_context_data(self, **kwargs):
context = super().get_context_data()
context['payments'] = Payments.objects.all()
return context
class DetailPrint(pdf_views.LatexToPDFDetailView):
template_name = 'payment_detail.tex'
queryset = Payments.objects.all()- Using latex template with persian fonts requires you to have installed your persian fonts in home directory.
mkdir ~/.fonts
cp /path_to_fonts/Vazirmatn.ttf ~/.fonts/
fc-cache -f -v- In latex template make sure you have used
xepersianpackage as last package. - Define persian fonts in latex template.
- You can use django template tags in latex template.
Here is an example of latex template for a given view:
\documentclass[a4paper,9pt]{letter}
\usepackage[portrait,margin=0.1in]{geometry}
\usepackage{xepersian}
\settextfont{Vazirmatn}
\setlatintextfont{Vazirmatn}
\setdigitfont[Scale=1.1]{Vazirmatn}
\begin{document}
{% for payment in payments %}
{{ payment.trace_code }}
\newline
{{ payment.amount }}
\newline
{% endfor %}
\end{document}You can specify the path to build engine in your project settings using DPP_LATEX_ENGINE and DPP_CHROME_ENGINE variables