解析PDF文件时出现问题

时间:2010-10-23 21:00:40

标签: java parsing pdf

我使用htmlparser 1.6来解析网站。

问题是当我解析pdf网站时,我在输出文件中获得了像

这样的奇怪字符
ØÇÁÖÜ/:?ÖQØ?WÕWÏ

这是我的代码片段:

try {
    parser = new Parser (); 

    if (1 < args.length)
        filter = new TagNameFilter (args[1]); 
    else
    { 
        filter = null;
        parser.setFeedback (Parser.STDOUT);
        Parser.getConnectionManager ().setMonitor (parser);
    }

    Parser.getConnectionManager ().setRedirectionProcessingEnabled (true);
    Parser.getConnectionManager ().setCookieProcessingEnabled (true);

    // Here the pdf web site
    parser.setResource ("http://hal.archives-ouvertes.fr" + 
        "/docs/00/16/76/78/PDF /27_Bendaoud.pdf");

    NodeList list = parser.parse(filter);
    NodeIterator i = list.elements ();

    while (i.hasMoreNodes ())
        processMyNodes(i.nextNode ());
}
catch (EncodingChangeException ece) {
    try {
        parser.reset ();
        NodeList list = parser.parse(filter);

        for (NodeIterator i = list.elements (); i.hasMoreNodes (); )
            processMyNodes (i.nextNode ());

    }
    catch (ParserException e) {
        e.printStackTrace ();
    }
}
catch (ParserException e) {
    e.printStackTrace ();
}

更新

我使用iText来解析PDF文件。它适用于本地文件,但我想解析托管在Web服务器中的PDF文件,例如:

  

http://protege.stanford.edu/publications/ontology_development/ontology101.pdf

如何使用iText或其他库执行此任务?

2 个答案:

答案 0 :(得分:3)

线索在名称中 - HTMLParser解析HTML。 HTML看起来像这样:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head><title>SimonJ's homepage</title></head>
  <body>...</body>
</html>

PDF不是HTML - 在原始形式中,它们看起来像这样:

%PDF-1.5^M%<E2><E3><CF><D3>1 0 obj<</Contents 3 0 R/Type/Page/Parent 121 0
R/Rotate 0/MediaBox[0 0 419.528015 595.276001]/CropBox[0 0 419.528015
595.276001]/Resources 2 0 R>>^Mendobj^M2 0 obj<</ColorSpace<</Cs6 132 0 R>>
/Font<</F3 102 0 R/F4 105 0 R>>/ProcSet[/PDF/Text]/ExtGState<</GS1 134 0
R>>>>^Mendobj^M3 0 obj<</Length 917/Filter/FlateDecode>>stream
H<89><A4><95><DB>r<A3>F^P<86><9F><80>w<E8>K<94>Z<8D><E7><C0><CC>0<97>^X!^E^WF
<8A><C0><9B><B8>\{At2ESC   ^\!<EF><96><DF>>= K"<B1>R<9B>Jq<C1><A9>^O_<FF>...

这是相当不同的,因此HTMLParser无法应对。如果你想解析PDF,你可能想要调查像iTextPDFBox这样的东西,虽然要注意:PDF文件格式不是为了方便提取文本而设计的 - 许多博士生已烧毁在尝试时... ...

答案 1 :(得分:1)

HtmlParser或任何其他HTML或XML解析器都没有希望解析PDF。 HTML格式与PDF格式完全不同。

您需要做的是让您的网络抓取软件注意远程Web服务器在您获取文档时返回的内容类型标头。这会告诉您刚刚获取的资源的名义格式。如果内容类型是PDF或链接提取器无法处理的其他格式,则不应尝试解析它。

目前您的代码执行此操作:

parser.setResource ("http://hal.archives-ouvertes.fr" + 
    "/docs/00/16/76/78/PDF /27_Bendaoud.pdf");

这需要替换为使用已打开的InputStream等设置资源的东西