我有一个App Engine Java Maven项目,配置了以下依赖项
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.9</version>
<exclusions>
<exclusion>
<artifactId>itextpdf</artifactId>
<groupId>com.itextpdf</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextg</artifactId>
<version>5.5.9</version>
</dependency>
我使用排除策略忽略主要的iText版本并使用特定于Android / App Engine的iTextG版本
我的项目配置为接收html输入,css文件和一些字体文件以制作PDF文件。
这里是与字体加载相关的部分代码
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
for (java.io.File fontFile : fontFiles) {
fontProvider.register(fontFile.getAbsolutePath());
}
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
...
在localhost环境中没有问题,PDF正确生成。在在线环境中,我收到此错误
java.lang.NoClassDefFoundError: java.nio.MappedByteBuffer is a restricted class. Please see the Google App Engine developer's guide for more details.
at com.google.apphosting.runtime.security.shared.stub.java.nio.channels.FileChannel_.map(FileChannel.java)
at com.itextpdf.text.io.MappedChannelRandomAccessSource.open(MappedChannelRandomAccessSource.java:105)
at com.itextpdf.text.io.FileChannelRandomAccessSource.<init>(FileChannelRandomAccessSource.java:74)
at com.itextpdf.text.io.RandomAccessSourceFactory.createBestSource(RandomAccessSourceFactory.java:240)
at com.itextpdf.text.io.RandomAccessSourceFactory.createBestSource(RandomAccessSourceFactory.java:224)
at com.itextpdf.text.io.RandomAccessSourceFactory.createBestSource(RandomAccessSourceFactory.java:191)
at com.itextpdf.text.pdf.RandomAccessFileOrArray.<init>(RandomAccessFileOrArray.java:151)
at com.itextpdf.text.pdf.TrueTypeFont.process(TrueTypeFont.java:800)
at com.itextpdf.text.pdf.TrueTypeFont.<init>(TrueTypeFont.java:499)
at com.itextpdf.text.pdf.BaseFont.getAllFontNames(BaseFont.java:1233)
at com.itextpdf.text.FontFactoryImp.register(FontFactoryImp.java:452)
at com.itextpdf.text.FontFactoryImp.register(FontFactoryImp.java:439)
从我已经完成的搜索中,我发现了两个重要的注释:
为了避免这种问题,我需要use a Font
object,直接从字体字节创建。 This is a code example
无法在库的G版本中删除列入黑名单的类(java.nio.MappedByteBuffer),因为它是used in other contexts
这里的问题是我无法在Font
内注册XMLWorkerFontProvider
对象,似乎Font对象可以直接与iText的主API一起使用,但不能与XMLWorker工具一起使用。
这种问题有什么解决方案吗?在App Engine中运行的html工作中是否真的不可能使用自定义字体?