[ https://issues.apache.org/jira/browse/PDFBOX-4242?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16517271#comment-16517271 ]
Tilman Hausherr commented on PDFBOX-4242: ----------------------------------------- We could add a finalizer in TrueTypeFont. However "Effective Java" advises against doing this because there is no guarantee that the finalizer will run in time, or it could run on one JVM and not on another. ("Item 8: Avoid finalizers and cleaners") So it's a design flaw... one possibility would be to attach fonts to a document as soon as it is created. However {{PDDocument.getFontsToSubset()}} is package-local. A workaround for users is simple - for each font opened there should be at least be in one call to {{PDAbstractContentStream.setFont}}. Or call {{PDDocument.subset()}} for unused fonts only. (However this can go bad. I tried calling it twice and got an exception) I'm thinking about making {{PDDocument.getFontsToSubset()}} public and add the fonts to that list when they are loaded, not when they are used. > Fontbox does not close file descriptor when loading fonts. > ---------------------------------------------------------- > > Key: PDFBOX-4242 > URL: https://issues.apache.org/jira/browse/PDFBOX-4242 > Project: PDFBox > Issue Type: Bug > Components: FontBox > Affects Versions: 2.0.9 > Reporter: Glen Peterson > Priority: Minor > Labels: file_leak > > My app has been getting "java.io.FileNotFoundException (No file descriptors > available)" and I've confirmed that it's because fontbox isn't closing it's > file descriptors. > In org.apache.fontbox.ttf.TTFParser there's this method: > {{public TrueTypeFont parse(File ttfFile) throws IOException {}} > {{ RAFDataStream raf = new RAFDataStream(ttfFile, "r");}} > {{ try {}} > {{ return this.parse((TTFDataStream)raf);}} > {{ } catch (IOException var4) {}} > {{ // close only on error (file is still being accessed later)}} > {{ raf.close();}} > {{ throw var4;}} > {{}}} > {{}}} > I would have expected to see the close() in a finally block so that the file > is always closed, not just on exceptions. Presumably, you can keep it in > memory without leaving the file descriptor open? > {{public TrueTypeFont parse(File ttfFile) throws IOException {}} > {{ RAFDataStream raf = new RAFDataStream(ttfFile, "r");}} > {{ try {}} > {{ return this.parse((TTFDataStream)raf);}} > {{ } catch (IOException var4) {}}{{ raf.close();}} > {{ throw var4;}} > {{ } finally {}} > {{ raf.close();}} > {{}}} > {{}}} > I tried performing this in a lazy initialization, but it blew up: > java.lang.RuntimeException: java.io.IOException: The TrueType font null does > not contain a 'cmap' tableCaused by: java.io.IOException: The TrueType font > null does not contain a 'cmap' table > at > org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapImpl(TrueTypeFont.java:548) > at > org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapLookup(TrueTypeFont.java:528) > at > org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapLookup(TrueTypeFont.java:514) > at org.apache.fontbox.ttf.TTFSubsetter.<init>(TTFSubsetter.java:91) > at > org.apache.pdfbox.pdmodel.font.TrueTypeEmbedder.subset(TrueTypeEmbedder.java:321) > at org.apache.pdfbox.pdmodel.font.PDType0Font.subset(PDType0Font.java:239) > at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1271) > Thoughts? > Thanks for PDFBox - it's been really helpful! -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org For additional commands, e-mail: dev-h...@pdfbox.apache.org