PythonがPDFを生成する方法の比較と要約

背景:リソースが限られていると、PDFエラーが非同期で発生し、メモリが不足します。
目的:リソースが限られている場合、PDFを同時に生成し、消費するリソース(リソース:CPUとメモリ)が少なくなり、同時PDFの速度が遅くなりすぎず、生成されるPDFスタイルが豊富である必要があります。生成されたPDFコンテンツは完全である必要があります。
私の調査によると、Pythonにはreportlab、pdfkit、xhtml2pdf、django-easy-pdfがあります。

1. Reportlabライブラリ
このライブラリは、それ自体でさまざまなグラフを描画できますが、reportlabライブラリに依存します。次に、フォントファイルを導入することでフォントの問題を解決できます。
簡単な例:


from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph,SimpleDocTemplate
from reportlab.lib import  colors
#  字体
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('song', STSONG.ttf))

Style=getSampleStyleSheet()

bt = Style['Normal']     #字体的样式
# bt.fontName='song'    #使用的字体
bt.fontSize=14            #字号
bt.wordWrap = 'CJK'    #该属性支持自动换行,'CJK'是中文模式换行,用于英文中会截断单词造成阅读困难,可改为'Normal'
bt.firstLineIndent = 32  #该属性支持第一行开头空格
bt.leading = 20             #该属性是设置行距

ct=Style['Normal']
# ct.fontName='song'
ct.fontSize=12
ct.alignment=1             #居中

ct.textColor = colors.red

t = Paragraph('hello',bt)
pdf=SimpleDocTemplate('ppff.pdf')
pdf.multiBuild([t])

第二に、pdfkitは
これに依存してurl、html、文字列に基づいてpdfファイルを生成します。これは確かに非常に便利ですが、欠陥、フォントの問題、スタイルの問題もあります。フォントは環境で設定する必要があります。複雑または高度なcssスタイル。スタンバイ。
コードサンプル:

#  pdfkit.from_string()  # 将字符串转成pdf文件,如果字符串是html代码,pdf也是识别的
#  pdfkit.from_file()  # 将文件转成pdf文件
#  pdfkit.from_url()  # 将网址的整个内容转成pdf文件

path_wk = BKAPP_WLS_PATH
config = pdfkit.configuration(wkhtmltopdf=path_wk)
try:
    result = pdfkit.from_url(instance.task_url,
                             path,
                             options={'encoding': "utf-8"},
                             configuration=config)
except Exception as e:
    logger.error('%s' % str(e))
    result = False

3. xhtml2pdfとdjango-easy-pdf
どちらもテンプレートレンダリングメソッドですが、多くのcssスタイルはサポートできず、フォントとcssスタイルの問題もあります。
コードサンプル:

from xhtml2pdf import pisa

sourceHtml = 'http://www.baidu.com/'
outputFilename = "test.pdf"

def convertHtmlToPdf(sourceHtml, outputFilename):
    resultFile = open(outputFilename, "w+b")
    pisaStatus = pisa.CreatePDF(sourceHtml,resultFile)
    resultFile.close()
    return pisaStatus.err

if __name__=="__main__":
    pisa.showLogging()
    convertHtmlToPdf(sourceHtml, outputFilename)

個人の照合と比較:

利点 不利益 個人的な意見
reportlab 基本的に、レポート、検査レポートなどに関連するすべてを達成することができます フォントはフォントファイル(14Mサイズ)をインポートする必要があります フォントの問題は簡単に解決できます。生成されたPDFには、さまざまなデータチャートの生成や画像スタイルも含まれますが、使用するのは面倒で、自分でコードを使用して描画するのと同じです(PDF内の各要素の位置を含む)。 、その後短時間pdf生成によって消費される多数のcpuとメモリはテストされていませんが、非同期またはマルチプロセスのバッチ生成を実行できます
pdfkit 生成されたPDFは美しく、第二に、多くのスタイルをサポートし、使いやすいです 軽量ソフトウェアwkhtmltopdfに依存する必要があります(最大の欠陥のように感じます)。プロジェクトがdockerにデプロイされている場合、フォントをdockerに設定する必要があります。次に、css3の一部のスタイルなど、高度すぎるcssスタイルはサポートされていません。 特別な要件がない場合は、基本的にニーズを満たすことができます。バッチテストを通じて、pdfkitは同時にpdfをバッチで生成できますが、CPUとメモリを消費します。生成されたPDFが大きいほど、コンテンツは多くなります。 CPUとメモリが消費されます。実稼働環境では、短時間で大量のpdfが生成されます。結局のところ、環境の安定性は何よりも重要です。
xhtml2pdf / django-easy-pdf PDFを生成できますが、美学は平均的であり、PDFの生成に使用されるテンプレートレンダリング方法です。 フォントの問題はフォントファイルを導入する必要があります。次に、サポートされているスタイルは一部のみで、スタイルはほとんどありません。 単純なpdfを使用できますが、複雑なpdfを生成すると、そのスタイルをサポートするのが難しいと推定されます。

注:
pdfkitは、11ページとさまざまなコンテンツチャートを含む1M PDFを生成するようにテストされています。テスト後、WKの起動は約5,000万〜7,000万のメモリを消費
し、600ページのPDFページとさまざまなコンテンツを含む4MPDFを生成します。これらのグラフのほとんどはフォントで記述されています。テスト後、WKの起動は約220M〜270Mのメモリを消費します。
したがって、生成されるPDFのサイズが大きくなり、ページ数が増える場合は、PDFを使用せずに生成する方がよいと思います。並行性を使用する必要がある場合は、コードレベルでPDFタスクの数を制御するのが最善です。消費と既存の環境に応じて。

おすすめ

転載: blog.csdn.net/qq_42631707/article/details/111211318