使用PDFBox时,为什么会出现此错误“java.io.IOException:Error:Header不包含versioninfo”?

时间:2015-07-30 18:03:33

标签: java pdfbox

这是我第一次在这里发帖,很抱歉,如果我没有正确地做到这一点。我正在尝试编写一个程序,在pdfs文件夹中找到某些模式,然后使用PDFBox将它们打印为列表。目前,它会在某些文件中找到模式匹配,但不是所有文件都匹配,即使我检查过,每个文件中应该有一个。它还会在打印前返回错误,上面写着“java.io.IOException:Error:Header不包含versioninfo”。我想知道这是不是它没有返回一些模式匹配的原因?如果是,我该如何解决?整个try / catch / finally部分对我来说有点困惑,所以也许它与此有关。 (我删除了一些问题不必要的代码)

public class PDF
{
    public static void main(String[] args) throws IOException

    {
        String number;
        String name;
        String state;
        String numberR =  "\\d{3}([.-])?\\d{3}\\1?\\d{4}|\\(\\d{3}\\)([.-])?\\d{3}\\2?\\d{4}|\\(\\d{3}\\)\\s\\d{3}([.-])?\\d{4}";
        String stateR = "[,]\\sAL\\s|[,]\\sMT\\s|[,]\\sAK\\s|[,]\\sNE\\s|[,]\\sAZ\\s|[,]\\sNV\\s|[,]\\sAR\\s|[,]\\sNH\\s|[,]\\sCA\\s|[,]\\sNJ\\s|[,]\\sCO\\s|[,]\\sNM\\s|[,]\\sCT\\s|[,]\\sNY\\s|[,]\\sDE\\s|[,]\\sNC\\s|[,]\\sFL\\s|[,]\\sND\\s|[,]\\sGA\\s|[,]\\sOH\\s|[,]\\sHI\\s|[,]\\sOK\\s|[,]\\sID\\s|[,]\\sOR\\s|[,]\\sIL\\s|[,]\\sPA\\s|[,]\\sIN\\s|[,]\\sRI\\s|[,]\\sIA\\s|[,]\\sSC\\s|[,]\\sKS\\s|[,]\\sSD\\s|[,]\\sKY\\s|[,]\\sTN\\s|[,]\\sLA\\s|[,]\\sTX\\s|[,]\\sME\\s|[,]\\sUT\\s|[,]\\sMD\\s|[,]\\sVT\\s|[,]\\sMA\\s|[,]\\sVA\\s|[,]\\sMI\\s|[,]\\sWA\\s|[,]\\sMN\\s|[,]\\sWV\\s|[,]\\sMS\\s|[,]\\sWI\\s|[,]\\sMO\\s|[,]\\sWY\\s|s";
        File folder = new File("/Users/bob/Desktop/");
        File[] listOfFiles = folder.listFiles();
        for (File file : listOfFiles) 
        {
            if (file.isFile())
            {
                name = file.getName();
                state = findInfo(stateR, name);
                number = findInfo(numberR, name);
                System.out.print(name + "       " + number + "     " + state.substring(1));
                System.out.println();
            }
        }
    }

    public static String findInfo(String regex,String name) throws IOException
    {
        File input = new File("/Users/bob/Desktop/" + name);
        PDDocument pd = null;
        try 
        {
            pd = PDDocument.load(input);
            StringBuilder sb = new StringBuilder();
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setStartPage(1);
            sb.append(stripper.getText(pd));
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(sb);

            while (m.find())
            {
                return m.group();
            }

        } 
        catch (Exception e)
        {
            e.printStackTrace();
            return " ";
        }
        finally
        {   
            if (pd != null)
            {
                pd.close();
            }
        }
        return " ";
     }      
}

编辑:也许它与PDFBox如何读取文件有关?我尝试打印出一个不起作用的文件并得到了这个:

         !"#    $%&'(! (

)* $

    +   )
,-

“/!01 %%4分之23$五万六千六百六十七 “         4美元%8%85%8美元 - % ,(#58“89 $” ...

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,原因是您在这里读取了错误的pdf文件

PDDocument.load(input);

当您尝试加载其他pdf文件时,PDFBox会引发该错误

答案 1 :(得分:0)

您正在读取( Desktop )目录中的 ALL 种文件。
如果该目录中恰好有一个非PDF文件,
尝试读取下一个文件时将发生此错误。
即使此(下一个)文件是有效的PDF。

可能的解决方案:

  • 从该目录中删除非PDF格式的文件。


  • 在调用PDDocument.load(input);
    #之前过滤掉非PDF文件(例如使用Regex),其中input是任何给定时间的有效PDF文件的名称。

答案 2 :(得分:-2)

我遇到了同样的问题。我通过使用带有LOG4J&的PDFBox的maven依赖来解决它。 SLF4J记录。必须将log4j.properties配置为项目中的src。首先确保所有文档都包含.pdf扩展名。