itextpdf 5.5.1从HTML转换时的PDF内容解析问题

时间:2017-08-07 09:27:47

标签: itext html2pdf xmlworker

我正在使用ItextPdf 5.5.1和Java中的XMLWorker 5.5.1进行HTML到PDF转换。 我设法转换高度与HTML内容相同的PDF文档,但PDF中的内容看起来更大,并且在行之间有不需要的空格。 HTML文档中没有这些空格。 enter image description here

private static void createPdf() {

    try {
        // getting HTML file from the path
        InputStream is = new FileInputStream(new File("/Users/salman.nazir/Desktop/html/tq.txt"));
        Date now = new Date();

        File file = new File(("/Users/salman.nazir/Desktop"), "my_" + now.getTime() + ".pdf");

        ElementList el = parseToElementList(is, new XMLWorkerFontProvider("resources/fonts/"));

        // width of 204pt
        float width = 204;

        // height as 10000pt (which is much more than we'll ever need)
        float max = 10000;

        //column without a `writer`
        ColumnText ct = new ColumnText(null);

        ct.setSimpleColumn(new Rectangle(width, max));
        for (Element e : el) {


            // Add only HTML Body Element
            // Avoiding IllegalArgumentException ("Format not found.")

            if(!e.isContent()) {
                System.out.print("META DATA");
            }
            else {
                ct.addElement(e);
            }
        }
        ct.go(true);

        // Getting y posItion from simulation mode
        float y = ct.getYLine();
        Rectangle pagesize = new Rectangle(width, (max - y) + 25);
        // Document with predefined page size
        Document document = new Document(pagesize, 0, 0, 0, 0);
        // Getting PDF Writer
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
        document.open();
        // Column with a writer
        ct = new ColumnText(writer.getDirectContent());
        ct.setSimpleColumn(pagesize);
        for (Element e : el) {

            // Add only HTML Body Element
            // Avoiding IllegalArgumentException ("Format not found.")

            if(!e.isContent()) {
                System.out.print("META DATA");
            }
            else {
                ct.addElement(e);
            }
        }
        ct.go();
        // closing the document
        document.close();

        showPDFPath(file.getAbsolutePath());

    } catch (Exception e) {
        e.printStackTrace();

    }
}

在代码中的任何地方设置分辨率是否有任何意义?这是在浏览器中正常工作的HTML代码。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
<head>
    <title>Lieferschein/Rechnung 27.03.17 11:18 2017/2432</title>


    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <style type="text/css">
        @font-face {
    font-family: "Roboto Mono";
    src: url('RobotoMono-Bold.ttf') format('ttf'), url('RobotoMono-BoldItalic.ttf') format('ttf'), url('RobotoMono-Italic.ttf') format('ttf'), url('RobotoMono-Light.ttf') format('ttf'), url('RobotoMono-LightItalic.ttf') format('ttf'), url('RobotoMono-Medium.ttf') format('ttf'), url('RobotoMono-MediumItalic.ttf') format('ttf'), url('RobotoMono-Regular.ttf') format('ttf'), url('RobotoMono-Thin.ttf') format('ttf'), url('RobotoMono-ThinItalic.ttf') format('ttf');
}
body {
    font-family: "Roboto Mono";
    font-size: 2pt;
    width: 100%;
    margin: 0pt;
}

.documentType {
    text-transform: uppercase;
}

        h1 {
    text-align: center;
    font-size: 16pt;
    font-weight: normal;
}
h2 {
    text-align: center;
    font-size: 10pt;
    font-weight: normal;
    margin: 0pt;
}
tr.manual_imprint td {
    border-bottom:1pt dotted black;
    height: 30pt;
    vertical-align: bottom;
}
h3 {
    text-align: center;
    font-size: 13pt;
    font-weight: normal;
}
h3.left {
    font-size: 13pt;
    text-align: left;
}
hr {
    height: 1pt;
    color: black;
    background-color: black;
    border: 0pt;
}
table {
    width: 100%;
    border: 0pt;
    padding: 0pt;
    border-spacing: 0pt;
}
tr.lineitem_head td {
    border-bottom:1pt solid black;
}
tr.total td {
    border-top:1pt solid black;
    border-bottom:3pt double black;
    font-size: 6pt;
    font-weight: bold;
}
td {
    overflow: hidden;
}
td.left {
    max-width: 1px;
    text-align: left;
    text-overflow: ellipsis;
    overflow: hidden;
    white-space: nowrap;
}
td.left_indent {
    text-align: left;
    padding-left: 7pt;
}
td.right {
    text-align: right;
    vertical-align: top;
    white-space: nowrap;
}
.image-container {
  display: flex;
  justify-content: center;
}

    </style>
</head>

<body>
<h1>Tischlerei Helmut Meyer_676647</h1>

<h2>Winsener Landstrasse 22</h2>
<br></br>
<div class="image-container"><img src="http://www.iconsdb.com/icons/download/gray/android-6-512.jpg"/> </div>   <h2>21423 Winsen / Luhe</h2>
<h2></h2>
<h2>Tel.: +4940441777</h2>



<h3 class="left documentType">Lieferschein/Rechnung</h3>

<table class="order">


    <tr class="lineitem_head">

        <td>Nr. 2017/2432</td>

        <td class="right">27.03.17 11:18</td>
    </tr>
</table>

<table class="lineitems">
    <colgroup>
        <col width="100%" />
        <col width="0%" />
    </colgroup>

    <tbody>

    <tr class="lineitem" data-net="3,78 €">

        <td class="left">1x&nbsp;Filter Kalita</td>
        <td class="right">4,50 €</td>

    </tr>


    <tr class="lineitem" data-net="3,03 €">

        <td class="left">1x&nbsp;Latte</td>
        <td class="right">3,60 €</td>

    </tr>


    <tr class="lineitem" data-net="7,38 €">

        <td class="left">1x&nbsp;Skywalker/250g</td>
        <td class="right">7,90 €</td>

    </tr>


    <tr class="lineitem" data-net="8,32 €">

        <td class="left">1x&nbsp;Playground Love</td>
        <td class="right">8,90 €</td>

    </tr>


    <tr class="lineitem" data-net="12,06 €">

        <td class="left">1x&nbsp;Dschaggah Khan</td>
        <td class="right">12,90 €</td>

    </tr>


    <tr class="lineitem" data-net="12,06 €">

        <td class="left">1x&nbsp;King Kongo</td>
        <td class="right">12,90 €</td>

    </tr>


    </tbody>

    <tfoot>
    <tr class="total">
        <td class="left">Total</td>
        <td class="right">50,70 €</td>
    </tr>
    <tr class="net">
        <td class="left">Netto</td>
        <td class="right">46,62 €</td>
    </tr>




    <tr class="tax">
        <td class="left">7,00 VAT</td>
        <td class="right">2,79 €</td>
    </tr>

    <tr class="tax">
        <td class="left">19,00 VAT</td>
        <td class="right">1,29 €</td>
    </tr>

    </tfoot>
</table>


<h3>Vielen Dank für Ihren Besuch!</h3>

<h2>St-Nr.: </h2>



</body>
</html>

1 个答案:

答案 0 :(得分:1)

您的问题是由于解析器中使用的打印分辨率,默认情况下为72。您应该设计该分辨率而不是100或任何其他分辨率(例如:如果要打印字母尺寸(8.5英寸)的PDF x 11英寸),而不是将像素设计为850px x 1100px,而应该在612px x 792px上进行。