【问题标题】:table width not set in iTextSharp when converting html to PDF将 html 转换为 PDF 时未在 iTextSharp 中设置表格宽度
【发布时间】:2015-09-24 15:36:23
【问题描述】:

我正在尝试将 html 转换为 pdf,但我面临的问题是 html 表格标签宽度设置不正确..

这是我的html

<table cellpadding='4' cellspacing='4' border='0' width='100%' style='width:100%'>
    <tr style='background-color:#000000'>
        <td colspan='2' align='center' valign='middle' width='100%'>
            <font face='Calibri' size='6' color='#FFFFFF'>Retail Natural Gas Deal Sheet</font>
        </td>
    </tr>
    <tr>
        <td colspan='2' width='100%'>&nbsp;</td>
    </tr>
    <tr>
        <td width='90%' style='width:90%'>
            <table cellpadding='0' cellspacing='0' border='0' width='100%'>
                <tr>
                    <td width='42%'>
                        <font face='Calibri' size='4'>
                            <b>Deal Number</b>
                        </font>
                    </td>
                    <td width='1%'>&nbsp;</td>
                    <td width='57%'>
                        <font face='Calibri' size='4'>
                            <b>15RTLG7149</b>
                        </font>
                    </td>
                </tr>
                <tr>
                    <td colspan='3' width='100%'>&nbsp;</td>
                </tr>
                <tr>
                    <td width='42%'>
                        <font face='Calibri' size='2'>
                            <b>Trade Date</b>
                        </font>
                    </td>
                    <td width='1%'>&nbsp;</td>
                    <td width='57%'>
                        <font face='Calibri' size='2'>February 09, 2015</font>
                    </td>
                </tr>
                <tr>
                    <td width='42%'>
                        <font face='Calibri' size='2'>
                            <b>Price Date</b>
                        </font>
                    </td>
                    <td width='1%'>&nbsp;</td>
                    <td width='57%'>
                        <font face='Calibri' size='2'>February 09, 2015</font>
                    </td>
                </tr>
                <tr>
                    <td width='42%'>
                        <font face='Calibri' size='2'>
                            <b>Authorize Date</b>
                        </font>
                    </td>
                    <td width='1%'>&nbsp;</td>
                    <td width='57%'>
                        <font face='Calibri' size='2'>February 09, 2015</font>
                    </td>
                </tr>
                <tr>
                    <td colspan='3' width='100%'>&nbsp;</td>
                </tr>
            </table>
        </td>
        <td width='10%' style='width:10%' valign='top'>
            <table cellpadding='0' cellspacing='0' border='0' width='100%'>
                <tr>
                    <td colspan='2' align='center' width='100%'>
                        <font face='Calibri' size='2'>
                            <b>Volumes (MMMBtu)</b>
                        </font>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table>

这是我用来生成 pdf 的 c# 代码

        Document pdfDoc = new Document();
        //Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
        //HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
        using (MemoryStream memoryStream = new MemoryStream())
        {
            PdfWriter writer = PdfWriter.GetInstance(pdfDoc, memoryStream);
            pdfDoc.Open();
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, new StringReader(HTML));
            pdfDoc.Close();
            byte[] bytes = memoryStream.ToArray();
            memoryStream.Close();

            return bytes;
        }

但这就是它在 pdf 中的呈现方式..我无法找到正确的答案..我需要帮助..提前致谢..

http://i.stack.imgur.com/8WyBh.jpg

【问题讨论】:

  • 您没有告诉我们您使用的是HTMLWorker(已弃用/不再支持=您的问题无法解决)还是XML Worker。我将使用 XML Worker 进行测试,但请承认您的 HTML 相当笨拙。
  • 是的,我正在使用 xmlworker.. 已在原始文章中进行了更新。
  • HTML 在浏览器中看起来是否符合您的预期?我认为错误在您的 HTML 中,而不是在 XML Worker 中。看我的回答。
  • 是的,html 在浏览器中看起来很完美..
  • 在那种情况下,我不明白这个问题。向我们展示您的 HTML 在浏览器中的样子(我使用 Chrome 作为参考)并指出 PDF 中的不同之处。

标签: pdf-generation itextsharp pdf-conversion


【解决方案1】:

我已将您的 HTML 复制粘贴到文本编辑器(Notepad++;在下面的屏幕截图中标记为 1)。我已经在浏览器中打开了这个 HTML(Chrome;在下面的屏幕截图中标记为 2)。我已将 HTML 转换为 PDF(使用 XML Worker;PDF 在下面的屏幕截图中标记为 3)。

当我将在浏览器中看到的内容与在 PDF 中看到的内容进行比较时,我的印象是 iText 的 XML Worker 做得很好。我在浏览器中看到的内容与在 PDF 中看到的内容没有太大区别。

但是,当我查看您的 HTML 时,我发现不一致。您是否尝试过在浏览器中查看您的 HTML?它看起来不像你预期的那样,是吗?似乎问题不是由 iText 引起的,而是由您创建 HTML 的方式引起的。请告诉我们 HTML 在浏览器中的外观是否符合您的预期。如果不是,请解释您的期望。现在,很难理解这个问题,因为我在 PDF 中看到的内容与我在浏览器中看到的内容非常吻合。

更新:

在您的问题中,您没有添加任何边框 (border='0'),很难理解您的意思。我现在添加了边框,因此 HTML 看起来像这样:

您希望 PDF 看起来像这样:

如果你像这样简化你的 HTML,这很容易:

<table cellpadding='4' cellspacing='4' border='1' width='100%' style='width:100%'>
    <tr style='background-color:#000000'>
        <td colspan='2' align='center' valign='middle'>
            <font face='Calibri' size='6' color='#FFFFFF'>XXXX XXXXX XXXXX</font>
        </td>
    </tr>
    <tr>
        <td colspan='2'>&nbsp;</td>
    </tr>
    <tr>
        <td width='90%' style='width:90%'>
            <table cellpadding='0' cellspacing='0' border='1' width='100%'>
                <tr>
                    <td width='42%'>
                        <font face='Calibri' size='4'>
                            <b>Deal Number</b>
                        </font>
                    </td>
                    <td width='1%'>&nbsp;</td>
                    <td width='57%'>
                        <font face='Calibri' size='4'>
                            <b>XXXXXXXXXX</b>
                        </font>
                    </td>
                </tr>
                <tr>
                    <td colspan='3' width='100%'>&nbsp;</td>
                </tr>
                <tr>
                    <td width='42%'>
                        <font face='Calibri' size='2'>
                            <b>Trade Date</b>
                        </font>
                    </td>
                    <td width='1%'>&nbsp;</td>
                    <td width='57%'>
                        <font face='Calibri' size='2'>February 09, 2015</font>
                    </td>
                </tr>
                <tr>
                    <td width='42%'>
                        <font face='Calibri' size='2'>
                            <b>Price Date</b>
                        </font>
                    </td>
                    <td width='1%'>&nbsp;</td>
                    <td width='57%'>
                        <font face='Calibri' size='2'>February 09, 2015</font>
                    </td>
                </tr>
                <tr>
                    <td width='42%'>
                        <font face='Calibri' size='2'>
                            <b>Authorize Date</b>
                        </font>
                    </td>
                    <td width='1%'>&nbsp;</td>
                    <td width='57%'>
                        <font face='Calibri' size='2'>February 09, 2015</font>
                    </td>
                </tr>
                <tr>
                    <td colspan='3' width='100%'>&nbsp;</td>
                </tr>
            </table>
        </td>
        <td width='10%' style='width:10%' valign='top'>
            <table cellpadding='0' cellspacing='0' border='1' width='100%'>
                <tr>
                    <td colspan='2' align='center' width='100%'>
                        <font face='Calibri' size='2'>
                            <b>Xxxxxxx (XXXXXXX)</b>
                        </font>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table>

我改变了什么?我删除了&lt;td&gt;标签中的width='100%'colspan='2'。这个信息是模棱两可的:你是说两列加起来应该占宽度的 100%。然而:

  • 您已经在 &lt;table&gt; 标记中定义了它,您还拥有 width='100%',并且
  • 如果一个单元格的 colspan 为 2,并且您说该单元格应占宽度的 100%,则无法判断每列的宽度。将width='100%' 放在那里没有意义。

iTextSharp 根据可以找到宽度信息的第一行定义列的宽度。在这种情况下,此类信息的第一行宽度是具有 2 列的表中 colspan 2 的行。您将这 2 列组合的宽度定义为 100%,iTextSharp 将此解释为好像您想说每列占宽度的 50% (100% / 2)。

如果您删除此模糊信息,iText 将根据第三行中定义的宽度定义列的宽度(这是您所期望的)。

【讨论】:

  • 它实际上正确显示了 html,就像我想要的那样.. 我不知道如何在此评论中发布图像....
  • 我通过添加边框发现了问题(在你的问题中你使用了border='0')。我将更新我的示例并向您展示解决方案。
  • 布鲁诺,我实在是太感谢你了。。它就像一个魅力。从昨天开始,我一直在想它。非常感谢哥们。。
  • 这救了我。我真的很感激。
  • @BrunoLowagie 我正在创建包含用户输入的动态 HTML 内容的 PDF。如果用户输入的 html 表格有很多列,表格会到达页面的右边缘,与右边距重叠。我想在页面上显示尽可能多的内容以及右边距。您能提出一些建议来实现这一目标吗?
猜你喜欢
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2022-03-07
  • 2014-06-08
  • 2010-10-17
  • 1970-01-01
相关资源
最近更新 更多