xhtml2pdf неправильно конвертирует css django

#python #django #xhtml2pdf #pisa

#python #django #xhtml2pdf #pisa

Вопрос:

эй, ребята, итак, я уже некоторое время использую эту библиотеку, и я просто сталкиваюсь с этой ошибкой, что, используя эту библиотеку, она не конвертирует мой css из моего html должным образом в pdf, я использовал эту библиотеку для создания интернет-ваучеров для моего клиента, кто-нибудь знает, как я могу это исправить? спасибо, вот мой код

voucher.html

     <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <style type="text/css">
        
        * {
        box-sizing: border-box;
        }

        .row {
        display: flex;
        margin-left:-5px;
        margin-right:-5px;
        }

        .column {
        flex: 50%;
        padding: 5px;
        }

        table {
        border-collapse: collapse;
        border-spacing: 0;
        width: 100%;
        border: 1px solid #ddd;

        }

        th, td {
        text-align: left;
        padding: 16px;
        text-align: center;
        }

        tr:nth-child(even) {
        background-color: #f2f2f2;
        }
    @page {
        size: letter landscape;
        margin: 2cm;
    }
        </style>
    </head>
    <body>
        <div class="row">
        {% for data in akun %}
            <div class="column">
                <table>
                    <tr>
                        <th colspan="2">Voucher Internet 1 Hari</th>
                    </tr>
                    <tr>
                        <td>Username</td>
                        <td>{{akun.username}}</td>
                    </tr>
                    <tr>
                        <td>Password</td>
                        <td>{{akun.password}}</td>
                    </tr>
                    <tr>
                        <td>Harga</td>
                        <td>{{akun.harga}}</td>
                    </tr>
                    <tr>
                        <td colspan="2">Mikadmin.net</td>
                    </tr>
                </table>
            </div>
        {% endfor %}
        </div>
    </body>
    </html>
 

view.py

     def voucher_profile(request):
        mikrotik_session = request.session.get("mikadmin")
        template = get_template('voucher.html')
        host     = mikrotik_session.get("host")
        username = mikrotik_session.get("username")
        password = mikrotik_session.get("password")
        con  = routeros_api.RouterOsApiPool(host=host,username=username,password=password,plaintext_login=True)
        api  = con.get_api()
        content = api.get_resource('ip/hotspot/user/profile')
        content_user = api.get_resource('ip/hotspot/user')
        username_paket_profile = request.POST['name-profile']
        valid = request.POST['valid']
        limit_bandwidth = request.POST['rate-limit']
        harga_voucher = request.POST['harga-voucher']
        count_generate = request.POST['count_generate']
        akun = []
        content.add(
            name=username_paket_profile,
            shared_users="1",
            rate_limit=limit_bandwidth,
            status_autorefresh="1m",
            transparent_proxy="yes",
            on_login="""{
            :local pengguna $user;
            :local date [/system clock get date];
            :local time [/system clock get time];
            :log warning "$pengguna telah login pada jam $time";
            :if ([/ip hotspot user find name=$pengguna limit-uptime=%s]="") do={
            /ip hotspot user set [find name=$pengguna] limit-uptime=%s
            /ip hotspot active remove [find user=$pengguna]
            };
            :if ([/system schedule find name=$pengguna]="") do={
            /system schedule add name=$pengguna interval=%s on-event="/ip hotspot user remove [find name=$pengguna]rn/ip hotspot active remove [find user=$pengguna]rn/system schedule remove [find name=$pengguna]"
            }
            }""" % (valid, valid, valid))

        for data in range(int(count_generate)):
            generate_name = "".join(random.choice(string.ascii_letters) for x in range(6))
            generate_password = "".join(random.choice(string.ascii_letters) for x in range(6))
            content_user.add(name=generate_name,password=generate_password,profile=username_paket_profile)
            ctx = {"username":generate_name,"password":generate_password,"harga":harga_voucher}
            akun.append(ctx)

        context = {"akun":akun}
        html  = template.render(context)
        nama_file = 'voucher paket generate.pdf'
        file = open(nama_file, "w b")
        pisaStatus = pisa.CreatePDF(html.encode('utf-8'), dest=file,
                encoding='utf-8')

        file.seek(0)
        pdf = file.read()
        file.close()            
        return HttpResponse(pdf, 'application/pdf')
 

Ответ №1:

xhmtl2pdf поддерживает только ограниченное количество свойств css, как описано на странице документов:

 background-color
border-bottom-color, border-bottom-style, border-bottom-width
border-left-color, border-left-style, border-left-width
border-right-color, border-right-style, border-right-width
border-top-color, border-top-style, border-top-width
colordisplay
font-family, font-size, font-style, font-weight
height
line-height, list-style-type
margin-bottom, margin-left, margin-right, margin-top
padding-bottom, padding-left, padding-right, padding-top
page-break-after, page-break-before
size
text-align, text-decoration, text-indent
vertical-align
white-space
width
zoom
 

И добавляет несколько собственных для определения собственного стиля:

 -pdf-frame-border
-pdf-frame-break
-pdf-frame-content
-pdf-keep-with-next
-pdf-next-page
-pdf-outline
-pdf-outline-level
-pdf-outline-open
-pdf-page-break
 

А именно, он не принимает flex border-collapse и border-spacing из вашего кода.

Используйте его страницы и фреймы для определения макета вместо гибких столбцов.

Также в документе говорится, что у него есть некоторый стиль по умолчанию для страницы, который вы можете сбросить, отредактировать или заменить, как описано здесь:

 # dump
$ xhtml2pdf --css-dump > xhtml2pdf-default.css
 
 # replace
$ xhtml2pdf --css=xhtml2pdf-default.css test.html
 

Комментарии:

1. о, я просто знал это, но как я могу добиться, чтобы моя таблица была из стороны в сторону при преобразовании ее в PDF с использованием xhtml2pdf? поскольку я добиваюсь этого в своем css с помощью flex-box, я пытаюсь использовать страницу @, но, похоже, я вообще ничего не делаю, можете ли вы дать мне какую-нибудь помощь или советы или, может быть, библиотеку, которую я могу использовать для этого? Спасибо

2. Вероятно, вам нужно создать таблицу с несколькими td в каждом tr. Если ваш дизайн не требует строго нескольких таблиц — отобразите одну таблицу с несколькими td в каждой строке. Также вы можете отобразить страницу в браузере и использовать js для загрузки с нее PDF-файла: codexworld.com/convert-html-to-pdf-using-javascript-jspdf