JavaScript中使用iText遇类型错误:FileChannelRandomAccessSource非函数
TIFF转PDF的JavaScript代码报错排查
我将Java的TIFF转PDF代码转换为JavaScript(基于iText库),代码如下:
// 原Java示例改编 importPackage(java.io); importPackage(org.apache.commons.io); importPackage(com.itextpdf.text.Document); importPackage(com.itextpdf.text.Image); importPackage(com.itextpdf.text.Rectangle); importPackage(com.itextpdf.text.io.FileChannelRandomAccessSource); importPackage(com.itextpdf.text.pdf.PdfWriter); importPackage(com.itextpdf.text.pdf.RandomAccessFileOrArray); importPackage(com.itextpdf.text.pdf.codec.TiffImage); function generatePdfFromTiff(sourceFile) { var aFile = new RandomAccessFile(sourceFile, "r"); var inChannel = aFile.getChannel(); var fcra = new FileChannelRandomAccessSource(); var document = new Document(); var baos = new java.io.ByteArrayOutputStream(); PdfWriter.getInstance(document, baos); document.open(); var rafa = new RandomAccessFileOrArray(fcra); var pages = TiffImage.getNumberOfPages(rafa); var image; for (var i = 1; i <= pages; i++) { image = TiffImage.getTiffImage(rafa, i); var pageSize = new Rectangle(image.getWidth(), image.getHeight()); document.setPageSize(pageSize); document.newPage(); document.add(image); } document.close(); aFile.close(); return org.apache.commons.codec.binary.Base64.encodeBase64String(baos.toByteArray()); }
运行时持续收到错误:
TypeError: [JavaPackage com.itextpdf.text.io.FileChannelRandomAccessSource] is not a function, it is object.
问题原因及解决方法
- 核心错误:
FileChannelRandomAccessSource的实例化缺少必要参数。Java中该类的构造函数需要传入FileChannel对象,当前代码是空参数调用,导致Rhino无法识别为合法的构造函数调用。 - 修正步骤:
- 将
var fcra = new FileChannelRandomAccessSource();修改为var fcra = new FileChannelRandomAccessSource(inChannel);,传入之前获取的文件通道对象。 - 确保运行环境已正确加载包含
com.itextpdf.text.io.FileChannelRandomAccessSource类的iText jar包。 - 简化替代方案:可跳过手动实例化
FileChannelRandomAccessSource,直接用文件路径初始化RandomAccessFileOrArray,即var rafa = new RandomAccessFileOrArray(sourceFile);,减少中间步骤的出错概率。
- 将
内容的提问来源于stack exchange,提问作者Crudler
相关产品推荐
相关产品推荐

