Comparación y resumen de la forma en que Python genera PDF

Antecedentes: con recursos limitados, se produce un error de PDF de forma asincrónica y no hay memoria suficiente.
Propósito: en el caso de recursos limitados, generará un PDF al mismo tiempo y consumirá menos recursos (recursos: CPU y memoria), y la velocidad del PDF concurrente no puede ser demasiado lenta, el estilo PDF generado debe ser rico y el El contenido PDF generado debe estar completo.
Según mi investigación, hay reportlab, pdfkit, xhtml2pdf, django-easy-pdf en python.

1. Biblioteca de Reportlab
Esta biblioteca puede dibujar varios gráficos por sí misma, pero depende de la biblioteca de Reportlab. En segundo lugar, los problemas de fuentes se pueden resolver introduciendo archivos de fuentes.
Ejemplo simple:


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])

En segundo lugar, pdfkit se basa en
esto para generar archivos pdf basados ​​en url, html y cadenas. De hecho, es muy útil, pero también tiene defectos, problemas de fuente y problemas de estilo. La fuente debe configurarse en el entorno. También es Estilos CSS complejos o avanzados.
Muestra de código:

#  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. Tanto xhtml2pdf como django-easy-pdf
son métodos de representación de plantillas, pero muchos estilos CSS no son compatibles y también existen problemas de fuentes y estilos CSS.
Muestra de código:

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)

Cotejo y comparación personal:

la manera ventaja Desventaja Opinión personal
reportlab Básicamente, se puede lograr todo lo relacionado con informes, informes de inspección, etc. Las fuentes necesitan importar archivos de fuentes (tamaño 14M) El problema de la fuente es fácil de resolver. El pdf generado puede tener varias generaciones de gráficos de datos e incluso estilos de imagen, pero es demasiado engorroso de usar, lo que equivale a dibujar con código usted mismo (incluida la posición de cada elemento en el pdf) , seguido de un tiempo breve No se ha probado una gran cantidad de CPU y memoria consumidas por la generación de PDF, pero se puede realizar la generación de lotes asincrónica o multiproceso
pdfkit El pdf generado es hermoso y, en segundo lugar, admite muchos estilos y es fácil de usar. Necesita confiar en el software ligero wkhtmltopdf (se siente como el mayor defecto). Si el proyecto se implementa en la ventana acoplable, las fuentes deben configurarse en la ventana acoplable. En segundo lugar, no se admiten estilos CSS demasiado avanzados, como algunos estilos de css3 Si no hay requisitos especiales, básicamente puede satisfacer las necesidades. A través de pruebas por lotes, pdfkit puede generar archivos PDF en lotes al mismo tiempo, pero consume cpu y memoria. Cuando el PDF generado es más grande, el contenido es más, más cpu y memoria se consumen. En el entorno de producción, se genera una gran cantidad de pdfs en poco tiempo. No se recomienda su uso, después de todo, la estabilidad del entorno es más que todo
xhtml2pdf / django-easy-pdf Puede generar pdf, pero la estética es promedio, el método de renderizado de plantillas utilizado para generar pdf Los problemas de fuentes deben introducir archivos de fuentes; en segundo lugar, solo se admiten algunos estilos y hay pocos estilos Se puede utilizar un pdf simple, si se genera un pdf complejo, se estima que es difícil soportar el estilo

Nota:
pdfkit ha sido probado para generar un PDF de 1M con 11 páginas y varios cuadros de contenido. Después de la prueba, el inicio de un WK consume alrededor de 50M-70M de memoria;
genera un PDF de 4M con 600 páginas de páginas PDF y varios contenidos. La mayoría de estos gráficos se describen en fuentes. Después de la prueba, el inicio de un WK consume alrededor de 220M-270M de memoria.
Por lo tanto, cuando el tamaño del PDF generado es mayor y la cantidad de páginas aumenta, creo que es mejor no usar y generar PDF. Si debe usar concurrencia, lo mejor es controlar el número de tareas PDF a nivel de código. según el consumo y el entorno existente.

Supongo que te gusta

Origin blog.csdn.net/qq_42631707/article/details/111211318
Recomendado
Clasificación