次の依存関係で構成された 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 バージョンを使用する除外戦略を使用しています
私のプロジェクトは、PDF ファイルを作成するために、html 入力、css ファイル、およびいくつかのフォント ファイルを受け取るように構成されています。
ここにフォントの読み込みに関連する部分的なコードがあります
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)
すでに行った検索から、2 つの重要なメモを見つけました。
この種の問題を回避するには、フォント バイトから直接作成されたobjectを使用する必要があります。
Font
これはコード例ですブラックリストに登録されたクラス (java.nio.MappedByteBuffer) は、他のコンテキストで使用されているため、ライブラリの G バージョンでは削除できません。
ここでの問題は、Font
内にオブジェクトを登録できないXMLWorkerFontProvider
ことです。Font オブジェクトは iText のメイン API で直接使用できますが、XMLWorker ツールでは使用できないようです。
この種の問題に対する解決策はありますか?App Engine 内で実行されている html 作品内でカスタム フォントを使用することは本当に不可能ですか?