Swift 中 PDFKit 的 HTML 分页符后的大间隙

问题描述

我正在按如下方式创建 PDF:

let contextString = "<p style=\"page-break-after: always;\">hello</p><p>This is a test</p>"

let print = UIMarkupTextPrintFormatter(markupText: contextString)

let render = UIPrintPageRenderer()
render.addPrintFormatter(print,startingAtPageAt: 0)

let page = CGRect(x: 0,y: 0,width: 595.2,height: 841.8)
render.setValue(page,forKey: "paperRect")
render.setValue(page,forKey: "printableRect")

let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData,.zero,nil)

for i in 0..<render.numberOfPages {
UIGraphicsBeginpdfpage();
    render.drawPage(at: i,in: UIGraphicsGetPDFContextBounds())
}
UIGraphicsEndPDFContext();

let av = UIActivityViewController(activityItems: [pdfData],applicationActivities: nil)

UIApplication.shared.windows.first?.rootViewController?.present(av,animated: true,completion: nil)

contextString 要复杂得多。分页符似乎有效。但是在第 2 页的顶部,我看到了一个巨大的空白。

如果我将 HTML 代码复制到一个文件并尝试通过 Safari 打印它,它会正常工作。

有人有这方面的经验吗?

enter image description here

HTML 文件

(第 88 行是分页符


<!DOCTYPE html>
<html>

<head>
    <Meta charset="utf-8">
</head>

<body>
    <style>
        * {
            font-family: arial,sans-serif;
        }

        p {
            font-size: 14px;
        }

        table {
            font-size: 14px;
            border-collapse: collapse;
            width: 100%;
            margin-bottom: 10px;
        }

        td,th {
            border: 1px solid #dddddd;
            text-align: left;
            padding: 3px;
        }

        th {
            background-color: #dddddd;
        }

        /*tr:nth-child(even) {background-color:#dddddd;}*/
    </style>
    <h2 style="position: absolute; right: 50px; margin-top: 0px;">Nr: <span style="margin-left: 50px">#121</span></h2>
    <br /><br />
    <p style="position: absolute; left: 55%; margin-bottom: 50px;"><b>Billingaddress:</b></p><br />
    <div style="position: absolute; left: 55%; margin-bottom: 50px; margin-top: 30px; line-height: 50%"><br />
        <p>John Doe</p>
        <p>Musterstreet 42</p>
        <p>5000 Mustercity</p>
    </div>
    <h1>Rapport</h1><br />
    <div style="position: relative; top: -18px">
        <p>Date:</p>
        <p>Order Nr:</p>
    </div>
    <div style="position: relative; top: -78px; left: 200px;">
        <p>2021-02-02</p>
        <p>121</p>
    </div>
    <div style="width: 100%; background-color: rgb(133,133,133)">
        <p style="padding: 5px; font-size: 15px"><b>Orderinfos</b></p>
    </div>
    <div>
        <div>
            <p><b>Customer:</b></p>
            <p><b>Contact Person:</b></p>
            <p><b>Object:</b></p>
            <p><b>Tenant:</b></p>
            <p><b>Type of Work:</b></p>
        </div>
        <div style="position: absolute; top: 335px; left: 220px;">
            <p>John Doe</p>
            <p>John Doe</p>
            <p>House</p>
            <p>-</p>
            <p>Kitchentable</p>
        </div>
    </div>
    <div style="position: absolute; top: 335px; left: 55%">
        <div>
            <p><b>Phone:</b></p>
            <p><b>E-Mail:</b></p>
            <p><b>Place:</b></p>
            <p><b>Execution:</b></p>
        </div>
        <div style="position: relative; top: -120px; left: 220px;">
            <p>-</p>
            <p>john.doe@hisdomain.com</p>
            <p>Mustercity</p>
            <p>???</p>
        </div>
    </div>
    <div style="page-break-after: always;">
        <div style="width: 100%; background-color: rgb(133,133);  margin-top: 50px;">
            <p style="padding: 5px; font-size: 15px; margin-bottom: 0px;"><b>Description</b></p>
        </div>
        <table>
            <tr>
                <td style="width: 100px;">Pos. 1</td>
                <td>Kitchentable</td>
            </tr>
        </table>
        <table style="page-break-inside: avoid">
            <tr>
                <th>Description</th>
            </tr>
            <tr>
                <td>Lorem ipsum dolor sit amet,consetetur sadipscing elitr,sed diam nonumy eirmod tempor <br />
                    <br />invidunt ut labore et dolore magna aliquyam erat,sed diam voluptua. At vero eos et accusam et
                    justo duo dolores et ea rebum.
                </td>
            </tr>
        </table>
        <p><b>Material:</b></p>
        <table style="page-break-inside: avoid">
            <tr>
                <th style="width: 10%;">SKU. Nr.</th>
                <th style="width: 50%">Desc</th>
                <th style="width: 12%">Unit</th>
                <th style="width: 8%">Quantity</th>
                <th style="width: 10%">Price</th>
                <th style="width: 10%">Amount</th>
            </tr>
            <tr>
                <td>SP40</td>
                <td>Steelplate 40mm</td>
                <td>Stk.</td>
                <td>5</td>
                <td>0.40</td>
                <td>2.00</td>
            </tr>
            <tr>
                <td>SN4000</td>
                <td>Stahlnagel 40mm</td>
                <td>Stk.</td>
                <td>20</td>
                <td>0.40</td>
                <td>8.00</td>
            </tr>
        </table>
        <p><b>Work:</b></p>
        <table style="page-break-inside: avoid">
            <tr>
                <th style="width: 10%;">Date</th>
                <th style="width: 50%">Description</th>
                <th style="width: 12%">Unit</th>
                <th style="width: 8%">Quantity</th>
                <th style="width: 10%">Price</th>
                <th style="width: 10%">Amount</th>
            </tr>
            <tr>
                <td>25.02.2021</td>
                <td>Building</td>
                <td>h</td>
                <td>1.75</td>
                <td>90</td>
                <td>157.50</td>
            </tr>
            <tr>
                <td>06.02.2021</td>
                <td>More Building</td>
                <td>h</td>
                <td>5.25</td>
                <td>90</td>
                <td>472.50</td>
            </tr>
            <tr>
                <td>12.02.2021</td>
                <td>Transport</td>
                <td>h</td>
                <td>1.50</td>
                <td>100</td>
                <td>150.00</td>
            </tr>
            <tr>
                <td>09.02.2021</td>
                <td>TESTlxkxbf</td>
                <td>h</td>
                <td>5.00</td>
                <td>90</td>
                <td>450.00</td>
            </tr>
        </table>
        <p><b>Expenses</b></p>
        <table style="page-break-inside: avoid;">
            <tr>
                <th style="width: 10%;">Date</th>
                <th style="width: 50%">Desc</th>
                <th style="width: 12%">Driving / miles</th>
                <th style="width: 8%">Expenses</th>
                <th style="width: 10%">Price</th>
                <th style="width: 10%">Amount</th>
            </tr>
            <tr>
                <td>06.02.2021</td>
                <td>Cars</td>
                <td>50</td>
                <td></td>
                <td>700.00</td>
                <td>???</td>
            </tr>
            <tr>
                <td>03.02.2021</td>
                <td>Crane</td>
                <td></td>
                <td>Kran</td>
                <td>50.00</td>
                <td>???</td>
            </tr>
        </table>
    </div>
    </div>
    <div style="page-break-after: always;">
        <div style="width: 100%; background-color: rgb(133,133);  margin-top: 50px;">
            <p style="padding: 5px; font-size: 15px; margin-bottom: 0px;"><b>Description</b></p>
        </div>
        <table>
            <tr>
                <td style="width: 100px;">Pos. 2</td>
                <td>2nd Positin</td>
            </tr>
        </table>
        <table style="page-break-inside: avoid">
            <tr>
                <th>Description</th>
            </tr>
            <tr>
                <td>Some more description bla bla<br /><br />g</td>
            </tr>
        </table>
        <p><b>Material:</b></p>
        <table style="page-break-inside: avoid">
            <tr>
                <th style="width: 10%;">SKU. Nr.</th>
                <th style="width: 50%">Desc</th>
                <th style="width: 12%">Unit</th>
                <th style="width: 8%">Quantity</th>
                <th style="width: 10%">Price</th>
                <th style="width: 10%">Amount</th>
            </tr>
            <tr>
                <td>SN40</td>
                <td>Steelplate 40mm</td>
                <td>Stk.</td>
                <td>20</td>
                <td>0.40</td>
                <td>8.00</td>
            </tr>
        </table>
        <p><b>Work:</b></p>
        <table style="page-break-inside: avoid">
            <tr>
                <th style="width: 10%;">Date</th>
                <th style="width: 50%">Desc</th>
                <th style="width: 12%">Unit</th>
                <th style="width: 8%">Quantity</th>
                <th style="width: 10%">Price</th>
                <th style="width: 10%">Amount</th>
            </tr>
            <tr>
                <td>19.02.2021</td>
                <td>Analyse Problem</td>
                <td>h</td>
                <td>1.75</td>
                <td>50</td>
                <td>87.50</td>
            </tr>
        </table>
    </div>
    <div style=" ">
        <div style="width: 100%; background-color: rgb(133,133);  margin-top: 50px;">
            <p style="padding: 5px; font-size: 15px; margin-bottom: 0px;"><b>Description</b></p>
        </div>
        <table>
            <tr>
                <td style="width: 100px;">Pos. 3</td>
                <td>test</td>
            </tr>
        </table>
        <table style="page-break-inside: avoid">
            <tr>
                <th>Description</th>
            </tr>
            <tr>
                <td>trst</td>
            </tr>
        </table>
        <p><b>Material:</b></p>
        <table style="page-break-inside: avoid">
            <tr>
                <th style="width: 10%;">AKU. Nr.</th>
                <th style="width: 50%">Desc</th>
                <th style="width: 12%">Unit</th>
                <th style="width: 8%">Quantity</th>
                <th style="width: 10%">Price</th>
                <th style="width: 10%">Amount</th>
            </tr>
            <tr>
                <td>SN40</td>
                <td>Steelplate 40mm</td>
                <td>Stk.</td>
                <td>50</td>
                <td>0.40</td>
                <td>20.00</td>
            </tr>
        </table>
        <p><b>Work:</b></p>
        <table style="page-break-inside: avoid">
            <tr>
                <th style="width: 10%;">Date</th>
                <th style="width: 50%">Description</th>
                <th style="width: 12%">Unit</th>
                <th style="width: 8%">Quantity</th>
                <th style="width: 10%">Price</th>
                <th style="width: 10%">Amount</th>
            </tr>
            <tr>
                <td>12.02.2021</td>
                <td>test</td>
                <td>h</td>
                <td>150.00</td>
                <td>20</td>
                <td>3000.00</td>
            </tr>
            <tr>
                <td>12.02.2021</td>
                <td>th gv jz</td>
                <td>h</td>
                <td>48.00</td>
                <td>50</td>
                <td>2400.00</td>
            </tr>
            <tr>
                <td>12.02.2021</td>
                <td>jfnd</td>
                <td>h</td>
                <td>48.00</td>
                <td>50</td>
                <td>2400.00</td>
            </tr>
        </table>
        <p><b>Expenses</b></p>
        <table style="page-break-inside: avoid;">
            <tr>
                <th style="width: 10%;">Date</th>
                <th style="width: 50%">Desc</th>
                <th style="width: 12%">Driving / miles</th>
                <th style="width: 8%">Expenses</th>
                <th style="width: 10%">Price</th>
                <th style="width: 10%">Amount</th>
            </tr>
            <tr>
                <td>12.02.2021</td>
                <td>blabla</td>
                <td>50</td>
                <td>50</td>
                <td>50.00</td>
                <td>???</td>
            </tr>
        </table>
    </div>
    <table style="page-break-inside: avoid;">
        <tr>
            <th colspan="2">Ordertotal</th>
        </tr>
        <tr>
            <td style="width: 90%">Total Price CHF</td>
            <td style="width: 10%">9955.5</td>
        </tr>
        <tr>
            <td style="width: 90%">VAT 7.70%</td>
            <td style="width: 10%">766.57</td>
        </tr>
        <tr>
            <td style="width: 90%"><b>Order Total:</b></td>
            <td style="width: 10%"><b>10722.07</b></td>
        </tr>
    </table>
</body>

</html>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)