PDFBox:禁用字体缓存或更改其位置

时间:2016-12-23 16:31:02

标签: java pdfbox

当我致电PDField.setValue设置表单字段的值时,我得到以下堆栈跟踪:

FileSystemFontProvider.saveDiskCache(349) | Could not write to font cache
java.io.FileNotFoundException: /.pdfbox.cache (Permission denied)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
at java.io.FileOutputStream.<init>(FileOutputStream.java:145)
at java.io.FileWriter.<init>(FileWriter.java:73)
at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.saveDiskCache(FileSystemFontProvider.java:290)
at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.<init>(FileSystemFontProvider.java:226)
at org.apache.pdfbox.pdmodel.font.FontMapperImpl$DefaultFontProvider.<clinit>(FontMapperImpl.java:130)
at org.apache.pdfbox.pdmodel.font.FontMapperImpl.getProvider(FontMapperImpl.java:149)
at org.apache.pdfbox.pdmodel.font.FontMapperImpl.findFont(FontMapperImpl.java:413)
at org.apache.pdfbox.pdmodel.font.FontMapperImpl.findFontBoxFont(FontMapperImpl.java:376)
at org.apache.pdfbox.pdmodel.font.FontMapperImpl.getFontBoxFont(FontMapperImpl.java:350)
at org.apache.pdfbox.pdmodel.font.PDType1Font.<init>(PDType1Font.java:145)
at org.apache.pdfbox.pdmodel.font.PDType1Font.<clinit>(PDType1Font.java:79)
at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:62)
at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:143)
at org.apache.pdfbox.pdmodel.interactive.form.PDDefaultAppearanceString.processSetFont(PDDefaultAppearanceString.java:164)
at org.apache.pdfbox.pdmodel.interactive.form.PDDefaultAppearanceString.processOperator(PDDefaultAppearanceString.java:131)
at org.apache.pdfbox.pdmodel.interactive.form.PDDefaultAppearanceString.processAppearanceStringOperators(PDDefaultAppearanceString.java:107)
at org.apache.pdfbox.pdmodel.interactive.form.PDDefaultAppearanceString.<init>(PDDefaultAppearanceString.java:85)
at org.apache.pdfbox.pdmodel.interactive.form.PDVariableText.getDefaultAppearanceString(PDVariableText.java:93)
at org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.<init>(AppearanceGeneratorHelper.java:94)
at org.apache.pdfbox.pdmodel.interactive.form.PDTextField.constructAppearances(PDTextField.java:262)
at org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField.applyChange(PDTerminalField.java:228)
at org.apache.pdfbox.pdmodel.interactive.form.PDTextField.setValue(PDTextField.java:218)

我正在运行PDFBox 2.0.4,这是最新版本。我的网络服务器很可能无法在默认位置(似乎是JVM属性.pdfbox.cache)中写入user.home。有没有办法禁用磁盘缓存或更改缓存文件的位置?

我注意到我可以设置一个名为pdfbox.fontcache的JVM宽系统属性,但我的webapp与其他应用程序共享一个jvm,因此这不是最佳解决方案。我也尝试使用该解决方案并将pdfbox.fontcache设置为/tmp,但它实际上并没有创建文件(尽管它现在每次启动时只抛出一次堆栈跟踪)。

我查看了FileSystemFontProvider中的代码,问题代码似乎在saveDiskCache方法中。在该方法中,它首先尝试编写该文件,但抛出FileNotFoundException而不是SecurityException。 FileNotFoundException继承自IOException。

File file = getDiskCacheFile();
try
{
     writer = new BufferedWriter(new FileWriter(file));
}
catch (SecurityException e)
{
     return;
}

1 个答案:

答案 0 :(得分:5)

当您使用{J}可以在其中写入新文件的pdfbox.fontcache之类的临时文件夹设置/tmp时,可以在使用PDFBox生成PDF时创建名为.pdfbox.cache的缓存文件(I也使用PDFBox 2.0.4)。

也许您的JVM无法在/tmp目录中创建新文件?要检查这一点,请尝试使用运行JVM的用户使用交互式命令提示符(shell)创建新文件。

使用命令ls -lA /tmp,您应该在配置的临时文件夹中看到.pdfbox.cache文件(例如,使用tomcat JVM和用户):

  

-rw-r - r-- 1 tomcat tomcat 2050 Dec 29 16:13 .pdfbox.cache

这不是最佳解决方案,因为您无法在单个JVM上设置多个pdfbox.fontcache系统属性。