July 2016 / Feb. 2017, Markus Konrad markus.konrad@wzb.eu / Berlin Social Science Center
This repository contains a set of tools written in Python 3 with the aim to extract tabular data from (OCR-processed) PDF files. Before these files can be processed they need to be converted to XML files in pdf2xml format. This is very simple -- see section below for instructions.
After that you can view the extracted text boxes with the
pdf2xml-viewer tool if you like. The pdf2xml format can be loaded and parsed with functions in the common
submodule. Lines can be detected in the scanned images using the imgproc
module. If the pages are skewed or rotated, this can be detected and fixed with methods from imgproc
and functions in textboxes
. Lines or text box positions can be clustered in order to detect table columns and rows using the clustering
module. When columns and rows were successfully detected, they can be converted to a page grid with the extract
module and their contents can be extracted using fit_texts_into_grid
in the same module. extract
also allows you to export the data as pandas DataFrame.
If your scanned pages are double pages, you will need to pre-process them with splitpages
.
An extensive tutorial was posted here and is derived from the Jupyter Notebook contained in the examples. There are more use-cases and demonstrations in the examples directory.
- load and parse files in pdf2xml format (
common
module) - split scanned double pages (
splitpages
module) - detect lines in scanned pages via image processing (
imgproc
module) - detect page rotation or skew and fix it (
imgproc
andtextboxes
module) - detect clusters in detected lines or text box positions in order to find column and row positions (
clustering
module) - extract tabular data and convert it to pandas DataFrame (which allows export to CSV, Excel, etc.) (
extract
module)
This package is available on PyPI and can be installed via pip: pip install pdftabextract
The requirements are listed in requirements.txt
and are installed automatically if you use pip.
Only Python 3 -- No Python 2 support.
You need to convert your PDFs using the poppler-utils, a package which is part of most Linux distributions
and is also available for OSX via Homebrew or MacPorts. From this package we need the command pdftohtml
and can create
an XML file in pdf2xml format in the following way using the Terminal:
pdftohtml -c -hidden -xml input.pdf output.xml
The arguments input.pdf and output.xml are your input PDF file and the created XML file in pdf2xml format respectively. It is important that you specifiy the -hidden parameter when you're dealing with OCR-processed ("sandwich") PDFs. You can furthermore add the parameters -f n and -l n to set only a range of pages to be converted.
For usage and background information, please read my series of blog posts about data mining PDFs.
See the following images of the example input/output:
Generated (and skewed) pdf2xml file viewed with pdf2xml-viewer
Apache License 2.0. See LICENSE file.