当我致电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;
}
答案 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
系统属性。