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

use*_*428 6 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)
Run Code Online (Sandbox Code Playgroud)

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

我注意到我可以设置一个名为JVM的系统属性pdfbox.fontcache,但是我的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;
}
Run Code Online (Sandbox Code Playgroud)

Syl*_*gat 5

当您pdfbox.fontcache使用临时文件夹设置/tmpJVM可以在其中写入新文件.pdfbox.cache时,可以在使用PDFBox生成PDF时创建一个调用的缓存文件(我也使用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

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

  • @ tombo_189它是一个系统属性,您可以使用`java -D`选项设置它,如下所示:`java -Dpdfbox.fontcache =/tmp ...`如果您也可以使用`System.setProperty(')以编程方式设置它pdfbox.fontcache","/ tmp");`调用初始化代码. (5认同)