Scala项目使用iText PDF:ImageResource与ITextFSImage类型不匹配错误
问题
在Scala项目中使用iText库生成PDF,自定义了继承ITextUserAgent的ElabUserAgent类。调用Image.getInstance创建ImageResource时,将com.itextpdf.text.Image对象传入ITextFSImage构造方法出现类型不匹配错误,报错信息如下:
Class com.lowagie.text.Image not found - continuing with a stub.
[error] val fsImage = new ITextFSImage(itextImage)
简化后的代码如下:
import com.itextpdf.text.Image import org.xhtmlrenderer.pdf.ITextFSImage import org.xhtmlrenderer.pdf.ITextOutputDevice import org.xhtmlrenderer.pdf.ITextUserAgent import org.apache.commons.io.IOUtils import org.xhtmlrenderer.pdf._ import org.xhtmlrenderer.resource.ImageResource import org.xhtmlrenderer.resource.XMLResource import play.api.Environment import play.api.Logger import play.api.mvc.Result import play.api.mvc.Results import play.twirl.api.Html private class ElabUserAgent( environment: Environment, logger: Logger, outputDevice: ITextOutputDevice, ) extends ITextUserAgent(outputDevice) { override def getImageResource(uri: String): ImageResource = environment .resourceAsStream(uri) .map { stream => val itextImage = Image.getInstance(IOUtils.toByteArray(stream)) val fsImage = new ITextFSImage(itextImage) new ImageResource(fsImage) } .getOrElse { logger.error(s"Could not find '${uri}' while generating PDF") super.getImageResource(uri) } }
解决方案
- 对齐依赖版本:核心问题是
xhtmlrenderer(即Flying Saucer)与iText的版本不兼容。早期iText的包名为com.lowagie.text,后来升级后改为com.itextpdf.text,而你使用的ITextFSImage可能依赖旧版iText的类。- 如果使用新版Flying Saucer,确保引入的是适配iText 5+的依赖(如
org.xhtmlrenderer:flying-saucer-pdf-itext5),而非依赖旧版lowagie的flying-saucer-pdf。 - 若必须使用旧版Flying Saucer,则需要将iText依赖换回低版本(包名
com.lowagie.text),并修改代码中的导入语句。
- 如果使用新版Flying Saucer,确保引入的是适配iText 5+的依赖(如
- 修正导入类:如果确认依赖版本兼容,检查
ITextFSImage构造方法要求的参数类型。如果它需要com.lowagie.text.Image,则将代码中的导入从com.itextpdf.text.Image改为com.lowagie.text.Image,同时调整项目依赖的iText版本。 - 适配类转换:若无法更换依赖版本,可尝试将
com.itextpdf.text.Image实例转换为com.lowagie.text.Image,但这种方式不推荐,容易引发其他兼容性问题,优先选择版本对齐方案。
内容的提问来源于stack exchange,提问作者miraoui.bob
相关产品推荐
相关产品推荐

