jasper-reports - 用最新的 iText 7.0.1 替换 JasperReport iText 2.1.7

标签 jasper-reports itext

我们正在使用 JasperReport 6.1.0,它依赖于 com.lowagie:itext:jar:2.1.7.js2。看来 iText 2.1.7 有 IP 问题,iText 要求所有用户使用需要商业许可的最新版本。所以我们想购买 iText 许可证。现在 iText 最新版本是 7.0.1。我尝试按照以下步骤将 JasperReport 的 iText 2.1.7 替换为最新的 iText 7.0.1:

1.排除pom.xml中默认的itext 2.1.7依赖

<dependency>
  <groupId>net.sf.jasperreports</groupId>
  <artifactId>jasperreports</artifactId>
  <version>6.1.0</version>
  <exclusions>
    <exclusion>
      <groupId>com.lowagie</groupId>
      <artifactId>itext</artifactId>
    </exclusion>
    ...

2. 在 pom.xml 中添加新的 iText jars
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>barcodes</artifactId>
  <version>7.0.1</version>
  <!-- barcodes depends on kernel -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>font-asian</artifactId>
  <version>7.0.1</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>forms</artifactId>
  <version>7.0.1</version>
  <!-- forms depends on kernel and layout -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>hyph</artifactId>
  <version>7.0.1</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>io</artifactId>
  <version>7.0.1</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>kernel</artifactId>
  <version>7.0.1</version>
  <!-- kernel depends on io -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>layout</artifactId>
  <version>7.0.1</version>
  <!-- layout depends on kernel -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>pdfa</artifactId>
  <version>7.0.1</version>
  <!-- pdfa depends on kernel -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>sign</artifactId>
  <version>7.0.1</version>
  <!-- sign depends on kernel, layout and forms -->
</dependency>

3.运行mvn和测试报告功能,我得到以下错误:

2016-11-17 14:43:36,520 ERROR [c.i.c.d.DeferredOperationManager] [ Thread-49] Exception on Deferred Operation. Operation UUID: 2a647922-d6d0-450d-9b2d-4d97638ba03f. UI Error key:d9a16093-be20-4278-9f8b-93120c0a2231 - Error: java.lang.NoClassDefFoundError: com/lowagie/text/SplitCharacter



看起来 JasperReport 正在尝试查找 namespace 为“com.lowagie...”的旧 iText 类。
我试图解压缩新的 iText 7.0.1 jar,这些类在包“com.itextpdf ...”中。

如何让 JasperReport 调用新的 iText jar?

最佳答案

不能用iText 7替换iText 2.1.7,因为两个版本差异太大。我们确实知道有些人转而使用带有 JasperReports 的 iText 5。这需要对 JasperReports 进行大量更改,例如更改 com.lowagie 中的包名称。至 com.itextpdf (*) 并更改对 com.lowagie.text.Color 的引用至 com.itextpdf.text.BaseColor .

在 iText,我们注意到 iText 5 达到了上限。例如:我们使用 char 存储文本。这意味着每个字符仅使用 2 个字节存储。如果我们想支持印地语,这还不够。如果我们想为 iText 添加对印度语的支持,我们必须重写完整的字体层。在 iText 5 中“替换字体层”会非常困难,因为字体层是构建所有其余代码的基础。因此我们决定重写完整的 API。

您可以在此处观看有关此决定的更多详细信息的视频:Devoxx 2016: "Oops I broke my API"

然而:用 iText 7 替换 iText 2.1.7 的最大问题是 JasperReports 依赖于 PdfGraphics2D我们还没有将该部分移植到 iText 7(还没有)。我们甚至可能决定永远不移植该部分,因为如果您选择使用 PdfGraphics2D 就不可能创建 PDF/UA。 (而且 PDF/UA 变得越来越重要)。

(*) 2009 年,我决定从包名中删除我的名字。当我第一次发布 iText 时,我只拥有 lowagie.com 域,我使用了 com.lowagie我编写的所有 Java 代码的包。我没想到 iText 会如此成功。当每个人都开始使用 iText 时,每个人都开始亲自问我问题。我已经没有了生活。因此我创建了一家公司,我们特化了 iText 并取代了 com.lowagie与更中性 com.itextpdf是那些特化之一。

关于jasper-reports - 用最新的 iText 7.0.1 替换 JasperReport iText 2.1.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40652274/

相关文章:

java - iText 中的高棉语 Unicode

java - 如何使用 iText 在每个页面上添加总页码?

java - iText 表格 - 如何在一页上保留多行单元格?

java - FontFactory (lowagie),Java,尝试使用 UniJIS-UCS2-H(日语)时出现 UnsupportedEncodingException

java - 如何使 pdf 显示为下载选项而不是在浏览器上呈现?

javascript - 使用 Javascript 从 XML 文件获取参数名称

xml - 使用 XML 数据源而不是空白页时没有数据时显示 Jasper 报告

java - Spring MVC - 使用输出流和 HttpServletResponse 下载 PDF

java - 如何将jasper集成到jhipster项目中

pdf - iTextSharp 表格单元格间距可能吗?