[ 
https://issues.apache.org/jira/browse/PDFBOX-4242?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Glen Peterson updated PDFBOX-4242:
----------------------------------
    Description: 
My app has been getting "java.io.FileNotFoundException (No file descriptors 
available)" and I think 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' table}}{{Caused 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!

  was:
My app has been getting "java.io.FileNotFoundException (No file descriptors 
available)" and I think 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 can perform this in a lazy initialization, so if there's still good reason to 
leave the file descriptor open, I can at least only leave it open once instead 
of every time someone requests a PDF! But maybe the file descriptor doesn't 
need to be left open, and you can just close it?

Thanks for PDFBox - it's been really helpful!


> 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: Major
>              Labels: file_leak
>
> My app has been getting "java.io.FileNotFoundException (No file descriptors 
> available)" and I think 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' table}}{{Caused 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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to