首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >升级到11.4.6导致java.lang.NoClassDefFoundError:无法初始化类org.docx4j.fonts.IdentityPlusMapper

升级到11.4.6导致java.lang.NoClassDefFoundError:无法初始化类org.docx4j.fonts.IdentityPlusMapper
EN

Stack Overflow用户
提问于 2022-04-27 18:57:54
回答 2查看 407关注 0票数 1

案例:使用WordprocessingMLPackage编写docx,并使用来自org.docx4j.fontsIdentityPlusMapper()设置fontMapper,以映射我们收到的文档中的字体:

java.lang.NoClassDefFoundError: Could not initialize class org.docx4j.fonts.IdentityPlusMapper

at:getFontMapper()

这发生在从docx4j 11.2.8升级到11.4.6之后。

使用中的依赖关系是:

代码语言:javascript
运行
复制
org.docx4j:docx4j-core:11.4.6
org.docx4j:docx4j-export-fo:11.4.6
org.docx4j:docx4j-JAXB-ReferenceImpl:11.4.6

这是一个已知的问题吗?

期待一个可能的答复!

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2022-05-03 13:28:15

这似乎是一个字体加载问题。我在一个Mac (最新的蒙特利),我得到了同样的例外,在建设电话:

代码语言:javascript
运行
复制
java.lang.AssertionError: 
Expecting code not to raise a throwable but caught
  java.lang.AssertionError
    at org.docx4j.fonts.fop.complexscripts.fonts.GlyphPositioningTable$DeviceTable.<init>(GlyphPositioningTable.java:1778)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readPosDeviceTable(OTFAdvancedTypographicTableReader.java:1729)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readPosAnchor(OTFAdvancedTypographicTableReader.java:2053)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readMarkToLigaturePosTableFormat1(OTFAdvancedTypographicTableReader.java:2347)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readMarkToLigaturePosTable(OTFAdvancedTypographicTableReader.java:2373)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readGPOSSubtable(OTFAdvancedTypographicTableReader.java:3124)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readLookupTable(OTFAdvancedTypographicTableReader.java:3193)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readLookupList(OTFAdvancedTypographicTableReader.java:3220)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readCommonLayoutTables(OTFAdvancedTypographicTableReader.java:3241)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readGPOS(OTFAdvancedTypographicTableReader.java:3501)
    at org.docx4j.fonts.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader.readAll(OTFAdvancedTypographicTableReader.java:88)
    at org.docx4j.fonts.fop.fonts.truetype.OpenFont.handleCharacterSpacing(OpenFont.java:895)
    at org.docx4j.fonts.fop.fonts.truetype.OpenFont.readFont(OpenFont.java:867)
    at org.docx4j.fonts.fop.fonts.truetype.OFFontLoader.read(OFFontLoader.java:121)
    at org.docx4j.fonts.fop.fonts.truetype.OFFontLoader.read(OFFontLoader.java:105)
    at org.docx4j.fonts.fop.fonts.FontLoader.getFont(FontLoader.java:130)
    at org.docx4j.fonts.fop.fonts.FontLoader.loadFont(FontLoader.java:114)
    at org.docx4j.fonts.fop.fonts.autodetect.FontInfoFinder.find(FontInfoFinder.java:262)
    at org.docx4j.fonts.PhysicalFonts.getPhysicalFont(PhysicalFonts.java:307)
    at org.docx4j.fonts.PhysicalFonts.addPhysicalFonts(PhysicalFonts.java:246)
    at org.docx4j.fonts.PhysicalFonts.addPhysicalFont(PhysicalFonts.java:236)
    at org.docx4j.fonts.PhysicalFonts.discoverPhysicalFonts(PhysicalFonts.java:183)
    at org.docx4j.fonts.IdentityPlusMapper.<clinit>(IdentityPlusMapper.java:74)
    at foo(...)

open fun foo(...) {
    ...
    val mlPackage = WordprocessingMLPackage.load(ByteArrayInputStream(input))
    mlPackage.fontMapper = IdentityPlusMapper() //<-- boom
}

更新(2022年8月29日):我通过将Docx4j升级到11.4.7解决了这个问题。此外,在调用Docx4J.toFO(...)之前,我还必须添加以下代码

代码语言:javascript
运行
复制
val fopFactoryBuilder: FopFactoryBuilder = FORendererApacheFOP.getFopFactoryBuilder(foSettings)
FORendererApacheFOP.getFOUserAgent(foSettings, fopFactoryBuilder.build())
票数 0
EN

Stack Overflow用户

发布于 2022-10-11 04:21:16

这个断言错误出现在IdentityPlusMapper或BestMatchingMapper的静态块中,不管我们使用什么。确切的线条是:

代码语言:javascript
运行
复制
PhysicalFonts.discoverPhysicalFonts();

该问题的解决方法是使用字体选择regex限制在静态块之前加载字体,如javadoc中所述:

代码语言:javascript
运行
复制
PhysicalFonts.setRegex()

以下方法快速解决了这个问题,同时减少了内存利用率和静态块的执行时间:

代码语言:javascript
运行
复制
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
                            .load(new ByteArrayInputStream(os.toByteArray()));
String fontRegex = ".*(Courier New|Arial|Times New Roman|Comic Sans|Georgia|Impact|Lucida Console|Lucida Sans Unicode|Palatino Linotype|Tahoma|Trebuchet|Verdana|Symbol|Webdings|Wingdings|MS Sans Serif|MS Serif).*";
                    
if(System.getProperty("os.name").startsWith("Windows")) {
  fontRegex = ".*(calibri|cour|arial|times|comic|georgia|impact|LSANS|pala|tahoma|trebuc|verdana|symbol|webdings|wingding).*";
}
PhysicalFonts.setRegex(fontRegex);
wordMLPackage.setFontMapper(new BestMatchingMapper());
Docx4J.toPDF(wordMLPackage, outputStream);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72033977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档