2016-12-23 70 views
4

當我打電話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是最新版本。我的網絡服務器很可能無法在默認位置寫入.pdfbox.cache(這似乎是JVM屬性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

IMO如果其他應用程序具有相同的修改後的字體緩存位置,則無關緊要。 –

回答

2

當您設置pdfbox.fontcache與像/tmp臨時文件夾,當你生成PDF PDFBox的JVM你可以在裏面寫入新文件,那麼可以創建一個名爲.pdfbox.cache緩存文件(我也用PDFBox的2.0.4)。

也許您的JVM無法在/tmp目錄中創建新文件?要檢查此操作,請嘗試使用用戶通過交互式命令提示符(shell)運行JVM來創建新文件。

用命令ls -lA /tmp,你應該可以看到一個.pdfbox.cache文件中的臨時文件夾,您配置(例如與Tomcat JVM和用戶):

-RW-R - R-- 1 tomcat的tomcat的2050 Dec 29 16:13 .pdfbox.cache

這不是一個最佳解決方案,因爲您無法在單個JVM上設置多個pdfbox.fontcache系統屬性。

+0

對不起,在這個問題中,jvm-config文件完全可以設置pdfbox.fontcache屬性,這樣它就可以實現「系統廣泛」的功能了嗎? –

+2

@ tombo_189這是一個系統屬性,你可以用'java -D'選項來設置它,像這樣:'java -Dpdfbox.fontcache =/tmp ...' 如果你還可以用'System .setProperty(「pdfbox.fontcache」,「/ tmp」);'調用初始化代碼。 –