2016-01-12 4 views
1

Я создаю настольное приложение JavaFX для просмотра PDF-файлов. PDF-файлы находятся в папке ресурсов. Я читаю файл ресурсов как поток, затем создаю временный файл и использую его для преобразования содержимого в изображение и отображения в ImageView.Apache PDFBox отказывается открыть временный созданный файл PDF

 currentPdf = new File("current.pdf"); 
     if (!currentPdf.exists()) { 
      // In JAR 
      InputStream inputStream = ClassLoader.getSystemClassLoader() 
        .getResourceAsStream("PDFSample.pdf"); 
      // Copy file 
      OutputStream outputStream; 
      try { 
       outputStream = new FileOutputStream(currentPdf); 
      } catch (FileNotFoundException e) { 
       throw new RuntimeException(e); 
      } 
      byte[] buffer = new byte[1024]; 
      int length; 
      try { 
       while ((length = inputStream.read(buffer)) > 0) { 
        outputStream.write(buffer, 0, length); 
       } 
       outputStream.close(); 
       inputStream.close(); 
      } catch(IOException e) { 
       throw new RuntimeException(e); 
      } 
     } 

Проблема: когда я создаю обычный файл с

currentPdf = new File("current.pdf"); 

Все работает, как ожидалось (я получить current.pdf созданный в директории, где находится jar). Но я хочу, чтобы файл был создан в системной папке temp и был удален при выходе из приложения. Я попытался это:

try { 
    currentPdf = File.createTempFile("current",".pdf"); 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} 
currentPdf.deleteOnExit();//also tried to comment this line 

и получить исключение:

Caused by: java.io.IOException: Error: End-of-File, expected line 
    at org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1517) 
    at org.apache.pdfbox.pdfparser.PDFParser.parseHeader(PDFParser.java:360) 
    at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:186) 
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1227) 
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1194) 
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1165) 
    at ua.com.ethereal.pdfquiz.Controller.getPdfPageAsImage(Controller.java:147) 

В этом методе:

@SuppressWarnings("unchecked") 
public static Image getPdfPageAsImage(File pdfFile, int pageNum) { 
    Image convertedImage; 
    try { 
     PDDocument document = PDDocument.load(pdfFile); 
     List<PDPage> list = document.getDocumentCatalog().getAllPages(); 
     PDPage page = list.get(pageNum); 
     BufferedImage image = page.convertToImage(BufferedImage.TYPE_INT_RGB, 128); 
     convertedImage = SwingFXUtils.toFXImage(image, null); 
     document.close(); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    return convertedImage; 
} 

ценят бы помочь в решении этой или указывая мне на пути, чтобы прочитать файл непосредственно из кувшина чтобы избежать создания временных копий.

ответ

3

Как вы создаете временный файл?

Обычные методы делают пустой файл в файловой системе. Это отключит вашу логику здесь:

if (!currentPdf.exists()) { 

что проверка якобы есть, чтобы избежать перезаписи покидающих файлов, но в этом случае вы должны избавиться от него. Как бы то ни было, вы пропустите свой код генерации PDF и попробуйте прочитать пустой файл.

+0

Я использовал File.createTempFile(); обновил фрагмент кода на вопрос. – Polyakoff

+2

Так что просто удалите 'if (! CurrentFile.exists())' полностью. 'File.createTempFile' гарантирует, что вы создадите новый файл и ничего не перезапишете. –

+0

Большое спасибо! Я удалил эту проверку, и все работает так, как ожидалось. Вы спасли мне много времени. – Polyakoff

Смежные вопросы