Reportlab python Pdf

#python #python-3.x #django #pdf #reportlab

Вопрос:

У меня есть этот тип кода, который помогает мне создавать pdf-файлы на основе данных, полученных из базы данных.

Но есть проблема, если длина строки слишком велика, то она переходит в другую строку, как в биллинговой голове.

Любое решение, касающееся этого, в соответствии с моим кодом. Этот Pdf-файл создан с помощью reportlab python в django.

Изображение Прилагается. Как вы видите, значения в Описании расходов пересекают столбец раздела SAC. Я хочу поместить половину символов в следующую строку, если длина описания зарядов слишком велика, чтобы избежать пересечения.

 def sea_export_local_invoice_pdf(request, pk):
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = ' filename="local_invoice.pdf"'
c = canvas.Canvas(response)

# _______________________ get object ___________________

lir_fed = SeaExLocalInvoiceReceivable.objects.get(pk=pk)c.setFont('Helvetica-Bold', 9)
    c.drawString(85, 548, 'Charges Description')
    c.line(201, 560, 201, 300)
    c.drawString(210, 548, 'SAC')
    c.line(237, 560, 237, 300)
    c.drawString(243, 548, 'Unit')
    c.line(268, 560, 268, 300)
    c.drawString(273, 548, 'Rate')
    c.line(296, 560, 296, 280)
    c.drawString(298, 548, 'Ex.Rate')
    c.line(332, 560, 332, 280)
    c.drawString(340, 548, 'Amount')
    c.line(381, 560, 381, 300)
    c.drawString(384, 548, 'IGST')
    c.line(407, 560, 407, 300)
    c.drawString(410, 548, 'CGST')
    c.line(437, 560, 437, 300)
    c.drawString(440, 548, 'SGST')
    c.line(467, 560, 467, 165)
    c.drawString(474, 548, 'Tax Amt')
    c.line(519, 560, 519, 280)
    c.drawString(533, 548, 'Total')
    c.line(25, 540, 575, 540)

    a = '07'
    # a = ndls_gst_cd.gst_code
    b = str(sm_lir.gst_code)

    if a == b:
        gstapplied = 1
        divide_total_tax = (float(all_lir.billing_gst_amount) / 2)
        c.drawString(470, 230, str(divide_total_tax))
        c.drawString(470, 215, str(divide_total_tax))
        c.drawString(470, 200, '0.0')

    else:
        gstapplied = 2
        c.drawString(470, 230, '0.0')
        c.drawString(470, 215, '0.0')
        c.drawString(470, 200, str(all_lir.billing_gst_amount))

y = 530
i = 1
for row in lir_fed:
    c.setFont('Helvetica', 7)
    c.drawString(32, y, str(i))
    c.drawString(48, y, str(row.billing_head))
    c.setFont('Helvetica', 7)
    c.drawString(205, y, str(row.sac))
    c.drawString(240, y, str(row.qty_unit))
    c.drawString(269, y, str(row.rate))
    c.drawString(302, y, str(row.ex_rate))
    c.drawString(335, y, str(row.amount))
    
 

Ответ №1:

Если вы можете использовать другую библиотеку для создания PDF-файлов, попробуйте pdfme. Он автоматически помещает текст в ячейки таблицы.

 from io import BytesIO

from django.http import HttpResponse
from pdfme import build_pdf

def sea_export_local_invoice_pdf(request, pk):
    document = {
        "sections": [
            {
                "content": [
                    {
                        "widths": [1, 5, 1, 1, 1, 1.2, 1.5, 1, 1, 1, 1.5, 1.5],
                        "style": {"s": 8, "cell_margin": 2},
                        "table": [
                            [
                                {'.b': 'S.No'},
                                {'.b': 'Charges Description'},
                                {'.b': 'SAC'},
                                {'.b': 'Unit'},
                                {'.b': 'Rate'},
                                {'.b': 'Ex.Rate'},
                                {'.b': 'Amount'},
                                {'.b': 'IGST'},
                                {'.b': 'CGST'},
                                {'.b': 'SGST'},
                                {'.b': 'Tax Amt'},
                                {'.b': 'Total'}
                            ],
                            [
                                1,
                                "EMPTY EQUIP BALANCE AND HANDOVER CHARGE",
                                95.9, 2, 2, 2, '8.00', '2%', '0.0', '0.0', 0.16, 8.16
                            ]
                        ]
                    },
                ]
            }
        ]
    }

    pdf_file = BytesIO()
    build_pdf(document, pdf_file)
    
    response = HttpResponse(pdf_file.read(), content_type='application/pdf')
    response['Content-Disposition'] = ' filename="local_invoice.pdf"'
    return response


 

С помощью этой библиотеки вам не придется иметь дело с ручным созданием строк таблицы. Вы просто помещаете туда содержимое таблицы, и все.

Ответ №2:

Вам нужно что-то, что может отображать HTML, как браузер. Нет ничего лучше Хрома. Безголовый Хром-это вариант, на который вам следует обратить внимание. И если вы не хотите возиться с настройкой безголового Chrome, вы можете попробовать API, предоставляемый PDFMark.com

Отказ от ответственности: Я разработчик.