Apache PDFBox拒绝打开临时创建的PDF文件

时间:2016-01-12 02:56:10

标签: java apache pdf javafx pdfbox

我正在创建用于查看PDF文件的桌面JavaFX应用程序。 PDF位于资源文件夹中。我将resourse文件作为流读取,然后创建临时文件并使用它将内容转换为图像并显示到ImageView中。

Issue detail:

{quote}
[Description of issue]
{quote}

Check it on Sonar: [value set in sonar.core.serverBaseURL]/issue/show/[issue ID]

问题是:当我使用

创建常规文件时
       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

获得例外:

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)

非常感谢帮助解决这个问题,或者指导我直接从jar中读取文件以避免创建临时副本。

1 个答案:

答案 0 :(得分:3)

如何创建临时文件?

通常的方法是在文件系统中创建一个空文件。这将使你的逻辑绊倒:

if (!currentPdf.exists()) {

该检查应该是为了避免覆盖现有文件,但在这种情况下你必须摆脱它。实际上,您跳过PDF生成代码并尝试读取空文件。