84

I'm looking for a PDF library which will allow me to extract the text from a PDF document. I've looked at PyPDF, and this can extract the text from a PDF document very nicely. The problem with this is that if there are tables in the document, the text in the tables is extracted in-line with the rest of the document text. This can be problematic because it produces sections of text that aren't useful and look garbled (for instance, lots of numbers mashed together).

I'd like to extract the text from a PDF document, excluding any tables and special formatting. Is there a library out there that does this?

Maksym Polshcha
  • 18,030
  • 8
  • 52
  • 77
Mike Cialowicz
  • 9,892
  • 9
  • 47
  • 76

2 Answers2

63

You can also take a look at PDFMiner (or for older versions of Python see PDFMiner and PDFMiner).

A particular feature of interest in PDFMiner is that you can control how it regroups text parts when extracting them. You do this by specifying the space between lines, words, characters, etc. So, maybe by tweaking this you can achieve what you want (that depends of the variability of your documents). PDFMiner can also give you the location of the text in the page, it can extract data by Object ID and other stuff. So dig in PDFMiner and be creative!

But your problem is really not an easy one to solve because, in a PDF, the text is not continuous, but made from a lot of small groups of characters positioned absolutely in the page. The focus of PDF is to keep the layout intact. It's not content oriented but presentation oriented.

Etienne
  • 12,440
  • 5
  • 44
  • 50
  • 2
    PDFMiner looks interesting. I be able to use the XML output from it, and then parse that to ignore what I don't want. This still requires substantial post-processing, but for now it's probably the best solution. Thank you. – Mike Cialowicz Dec 09 '09 at 17:25
  • @Etienne, can this be used if the PDF has other language characters too? – Sahil Mittal Jul 06 '14 at 20:10
  • It should work with other language characters. Docs mention: CJK languages and vertical writing scripts support. Best way to be sure, test it! – Etienne Jul 07 '14 at 17:57
  • if you are looking for better performance and Py3 check this http://zderadicka.eu/parsing-pdf-for-fun-and-profit-indeed-in-python/ libpoppler with python binding is 10x faster then PDFminer – Ivan Jul 24 '16 at 13:13
  • 1
    The pdfminer.six Python 3 port of PDFMiner is working well for me – hamish Aug 16 '17 at 14:52
  • 2
    Starting from version 20191010, PDFMiner supports **Python 3 only** – fantabolous Nov 07 '19 at 11:42
  • Warning: As of 2020, PDFMiner is not actively maintained. The code still works, but this project is largely dormant. For the active project, check out its fork pdfminer.six. – Semnodime Sep 27 '20 at 22:04
  • @Semnodime Thanks, I updated the answer with the community maintained version. – Etienne Sep 28 '20 at 23:59
2

That's a difficult problem to solve since visually similar PDFs may have a wildly differing structure depending on how they were produced. In the worst case the library would need to basically act like an OCR. On the other hand, the PDF may contain sufficient structure and metadata for easy removal of tables and figures, which the library can be tailored to take advantage of.

I'm pretty sure there are no open source tools which solve your problem for a wide variety of PDFs, but I remember having heard of commercial software claiming to do exactly what you ask for. I'm sure you'll run into them while googling.

akaihola
  • 26,309
  • 7
  • 59
  • 69