【问题标题】:Parse text from Pdf, txt, or docx file from URL without downloading it in Java 8从 URL 解析 Pdf、txt 或 docx 文件中的文本,而无需在 Java 8 中下载
【发布时间】:2015-05-02 03:18:49
【问题描述】:

我需要能够使用给定的 url 在线解析文件中包含的文本,即http://website.com/document.pdf

我正在做一个搜索引擎,它基本上可以告诉我搜索的单词是否在某个在线文件中,并检索文件的 URL,所以我不需要下载文件,只需阅读它。

我正在寻找一种方法,并通过InputStreamOpenConnection 找到了一些东西,但实际上并没有成功。

我正在使用 jsoup 来爬取网站以检索 URL,并且我试图使用 Jsoup 方法对其进行解析,但它不起作用。

那么最好的方法是什么?

编辑:

我希望能够做这样的事情:

File in = new File("http://website.com/document.pdf");
Document doc = Jsoup.parse(in, "UTF-8");
System.out.println(doc.toString());

【问题讨论】:

    标签: java parsing pdf stream jsoup


    【解决方案1】:

    您可以使用 URL 而不是文件来访问 URL。所以使用 Apache Tika 你应该能够以这种方式获取内容的字符串。

    import org.apache.tika.parser.pdf.PDFParser;
    import org.apache.tika.metadata.Metadata;
    import org.apache.tika.parser.ParseContext;
    import org.apache.tika.sax.BodyContentHandler;
    import org.xml.sax.ContentHandler;
    
    public class URLReader {
        public static void main(String[] args) throws Exception {
    
            URL url = new URL("http://website.com/document.pdf");
            ContentHandler contenthandler = new BodyContentHandler();
            Metadata metadata = new Metadata();
            PDFParser pdfparser = new PDFParser();
            pdfparser.parse(is, contenthandler, metadata, new ParseContext());
    
            System.out.println(contenthandler.toString());
        }
    }
    

    【讨论】:

    • PDF 不是文本文件。您的代码适用于文本文件,但很可能会破坏任何二进制文件。
    • 它有点工作,但它显示了很多编码字符,而不是 pdf 文件中保存的实际文本。谢谢你的回复,但你知道我怎样才能得到实际的文字吗?
    • 是的@mkl 是对的,我相信有一个用于在 java 中解析 PDF 的库我会尝试清除它并编辑我的答案,对不起 misakr
    • 下载二进制文件 go a byte[] 可以非常相似地完成。您只需直接使用InputStream 而不是将其包装在Reader 中,并且不要读入缓冲区String 而是byte[]
    • 我实际上正在使用 Apache Tika,它对我来说很好,它接收一个带有指向 PDF 文件的路径的字符串,自然,我给该方法的路径是本地路径,可以对这些在线 PDF 做同样的事情吗? (你可以在这里看到我的代码stackoverflow.com/questions/29982173/…
    【解决方案2】:

    您可以使用此代码首先下载 PDF 文件,然后使用 apache lib 阅读文本。你需要手动添加一些jar。 您需要设置本地pdf文件地址,默认为“download.pdf”。

    import com.gnostice.pdfone.PdfDocument;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.text.PDFTextStripper;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ConnectException;
    import java.net.URL;
    import java.net.URLConnection;
    
    
    public class LoadDocumentFromURL {
    public static void main(String[] args) throws IOException {
    
            URL url1 = new URL("https://arxiv.org/pdf/1811.06933.pdf");
            byte[] ba1 = new byte[1024];
            int baLength;
            FileOutputStream fos1 = new FileOutputStream("download.pdf");
            try {
                // Contacting the URL
                // System.out.print("Connecting to " + url1.toString() + " ... ");
                URLConnection urlConn = url1.openConnection();
                // Checking whether the URL contains a PDF
                if (!urlConn.getContentType().equalsIgnoreCase("application/pdf")) {
                    System.out.println("FAILED.\n[Sorry. This is not a PDF.]");
                } else {
                    try {
                        // Read the PDF from the URL and save to a local file
                        InputStream is1 = url1.openStream();
                        while ((baLength = is1.read(ba1)) != -1) {
                            fos1.write(ba1, 0, baLength);
                        }
                        fos1.flush();
                        fos1.close();
                        is1.close();
                        // Load the PDF document and display its page count
                        //System.out.print("DONE.\nProcessing the PDF ... ");
                        PdfDocument doc = new PdfDocument();
                        try {
                            doc.load("download.pdf");
                            // System.out.println("DONE.\nNumber of pages in the PDF is " + doc.getPageCount());
                            // System.out.println(doc.getAuthor());
                            // System.out.println(doc.getKeywords());
                            // System.out.println(doc.toString());
                            doc.close();
                        } catch (Exception e) {
                            System.out.println("FAILED.\n[" + e.getMessage() + "]");
                        }
                    } catch (ConnectException ce) {
                        //System.out.println("FAILED.\n[" + ce.getMessage() + "]\n");
                    }
                }
            } catch (NullPointerException npe) {
                //System.out.println("FAILED.\n[" + npe.getMessage() + "]\n");
            }
            File file = new File("your local pdf file address which is download.pdf");
            PDDocument document = PDDocument.load(file);
            PDFTextStripper pdfStripper = new PDFTextStripper();
            String text = pdfStripper.getText(document);
            System.out.println(text);
            document.close();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      相关资源
      最近更新 更多