Я создаю настольное приложение 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;
}
ценят бы помочь в решении этой или указывая мне на пути, чтобы прочитать файл непосредственно из кувшина чтобы избежать создания временных копий.
Я использовал File.createTempFile(); обновил фрагмент кода на вопрос. – Polyakoff
Так что просто удалите 'if (! CurrentFile.exists())' полностью. 'File.createTempFile' гарантирует, что вы создадите новый файл и ничего не перезапишете. –
Большое спасибо! Я удалил эту проверку, и все работает так, как ожидалось. Вы спасли мне много времени. – Polyakoff