iText XMLWorker CSSResolver在Java 7到Java 8上产生不同的结果

iText XMLWorker CSSResolver在Java 7到Java 8上产生不同的结果,itext,itextpdf,Itext,Itextpdf,我的网站上有一个功能,允许人们粘贴html评论,然后输出到pdf报告中。 我有一个问题,在从Java 7升级到Java 8(没有其他代码更改)之后,iText XMLWorker和CSSResolver似乎以pdf格式输出html表,而且边框很厚 Java 7: Java 8: 有人知道为什么会这样吗? 是否有我缺少的iText for Java 8的新设置/库 这是iTextPdf的错误吗 编辑 Maven依赖项: <dependency> <gr

我的网站上有一个功能,允许人们粘贴html评论,然后输出到pdf报告中。 我有一个问题,在从Java 7升级到Java 8(没有其他代码更改)之后,iText XMLWorker和CSSResolver似乎以pdf格式输出html表,而且边框很厚

Java 7:

Java 8:

有人知道为什么会这样吗? 是否有我缺少的iText for Java 8的新设置/库

这是iTextPdf的错误吗

编辑

Maven依赖项:

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.6</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>5.5.6</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-asian</artifactId>
        <version>5.2.0</version>
    </dependency>
示例html(这些用户从Excel复制和粘贴表格)


ABC12345
-1234567890123
交易费用
£
增值税
全部的
移除项目(仅限人工)
£0.00
£0.00
紧急拆卸(仅限人工)
£0.00
£0.00
更换项目(仅限人工)
£0.00
£0.00
附加的
拜访
£80.00
£16.00
£96.00
第A123部
£0.00
£0.00
第B123部分
£0.00
£0.00
第C123部分
£0.00
£0.00
第D123部
£0.00
£0.00
安全
£0.00
£0.00
要求访问
£58.00
£11.60
£69.60
重游
£0.00
£0.00
管理
£0.00
£0.00
A类
参观
£0.00
£0.00
保证
£0.00
£0.00
换锁
£0.00
£0.00
附加时间
现场
£0.00
£0.00
总计
138.00英镑
27.60英镑
165.60英镑

正如我在对问题的评论中所述,我们的情况很奇怪

|Java    | iText 5.5.6 | iText 5.5.7
|7       | good        | bad
|8       | bad         | bad
经过调查后发现,
iText 5.5.6
中的不一致性是通过使用
HashMap
创建的。在Java7中,迭代器通过一个特定的
HashMap
,如下所示:
边框左侧样式
,然后是
边框左侧宽度
;在Java8中,情况正好相反。由于
com.itextpdf.tool.xml.css.apply.HtmlCellCssApplier::setLeftOfOrder
中的代码取决于迭代的顺序,因此我们的实现容易受到此更改的影响

在Java8中,
HashMap
迭代的行为发生了变化,如中所示

我们意识到了这一点,并在
iText 5.5.7
中添加了一个修复程序,将
HashMap
替换为
LinkedHashMap
,因为后者保证了对入口集的“历史”迭代。看见显然,这并不是正确的做法,因为Java7和Java8现在的顺序都不对。我将把它添加到开发积压工作中,我们将尝试解决这个问题

编辑1:

下面是我们试图修复的一个最小用例。它当前在其中一个单元格周围生成一个矩形,这当然不应该发生

<table>
  <tr>
    <td style="border-style: none; border-width: 0px;">a</td>
    <td style="border-width: 0px; border-style: none;">a</td>
  </tr>
</table>

A.
A.

EDIT2:该修复程序自11月27日发布的iText 5.5.8起就可以使用了

能否添加HTML和CSS文件,以便我们可以尝试复制此问题?另外,您使用了哪个iText版本?我已经用maven依赖项、用于处理的代码和粘贴的html示例更新了帖子。我可以用iText 5.5.6重现您报告的问题。然而,在iText 5.5.7-SNAPSHOT的前沿构建中,Java 7和Java 8都显示了错误的输出(带有粗边框)。这很有趣:-)但调查可能需要一段时间。嗨@blagae!你最终设法调查了吗?我没有,对不起@PiersGeyman。我现在将对此进行研究显然,这并不是正确的做法,因为Java 7和8现在都得到了错误的顺序-在
style
之前的“错误”顺序,
width
,是OP的
style
属性中使用的顺序,可能原始顺序保留在
LinkedHashMap
中,在这种情况下,顺序是任意的。因此,代码最好根本不依赖于特定的顺序……是的,我的意思是修复程序应该使XMLWorker的行为独立于样式属性的顺序。啊,好吧,有一段时间我觉得您想要修复顺序……;)谢谢你看这个。在真正的修复正在进行时,我可以做任何临时修复吗?解析和重新排序样式属性是否会有所不同?如果非常紧急,则可以切换边框宽度和边框样式的顺序(仅在Java 8和/或iText 5.5.7中)作为解决方法。但我们正在进行最终修复,iText的新版本即将发布。
<table>
  <tr>
    <td style="border-style: none; border-width: 0px;">a</td>
    <td style="border-width: 0px; border-style: none;">a</td>
  </tr>
</table>