tabulapdf provides R bindings to the Tabula java library, which can be used to computationaly extract tables from PDF documents.
Note: tabulapdf is released under the MIT license, as is Tabula itself.
tabulapdf depends on rJava, which implies a system requirement for Java. This can be frustrating, especially on Windows. The preferred Windows workflow is to use Chocolatey to obtain, configure, and update Java. You need do this before installing rJava or attempting to use tabulapdf. More on this and troubleshooting below.
tabulapdf is not available on CRAN, but it can be installed from rOpenSci’s R-Universe:
install.packages("tabulapdf", repos = c("https://ropensci.r-universe.dev", "https://cloud.r-project.org"))
To install the latest development version:
if (!require(remotes)) install.packages("remotes")
# on 64-bit Windows
remotes::install_github(c("ropensci/tabulapdf"), INSTALL_opts = "--no-multiarch")
# elsewhere
remotes::install_github(c("ropensci/tabulapdf"))
The main function, extract_tables()
provides an R clone of the Tabula
command line application:
library(tabulapdf)
f <- system.file("examples", "data.pdf", package = "tabulapdf")
out1 <- extract_tables(f)
out1[[1]]
# # A tibble: 32 × 11
# mpg cyl disp hp drat wt qsec vs am gear carb
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
# 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
# 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
# 4 21.4 6 258 110 3.08 3.21 19.4 1 0 3 1
# 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
# 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
# 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
# 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
# 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
# 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
# # ℹ 22 more rows
# # ℹ Use `print(n = ...)` to see more rows
By default, it returns a list of tibbles. It can also write the tables
to disk or attempt to coerce them to a list of matrices using the
output
argument. It is also possible to select tables from only
specified pages using the pages
argument.
out2 <- extract_tables(f, pages = 1, guess = FALSE, output = "tibble")
out2[[1]]
# # A tibble: 32 × 11
# mpg cyl disp hp drat wt qsec vs am gear carb
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
# 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
# 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
# 4 21.4 6 258 110 3.08 3.21 19.4 1 0 3 1
# 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
# 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
# 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
# 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
# 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
# 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
# # ℹ 22 more rows
# # ℹ Use `print(n = ...)` to see more rows
It is also possible to manually specify smaller areas within pages to
look for tables using the area
and columns
arguments to
extract_tables()
. This facilitates extraction from smaller portions of
a page, such as when a table is embeded in a larger section of text or
graphics.
Another function, extract_areas()
implements this through an
interactive style in which each page of the PDF is loaded as an R
graphic and the user can use their mouse to specify upper-left and
lower-right bounds of an area. Those areas are then extracted
auto-magically (and the return value is the same as for
extract_tables()
). Here’s a shot of it in action:
locate_areas()
handles the area identification process without
performing the extraction, which may be useful as a debugger.
extract_text()
simply returns text, possibly separately for each
(specified) page:
out3 <- extract_text(f, page = 3)
cat(out3, sep = "\n")
# len supp dose
# 4.20 VC 0.50
# 11.50 VC 0.50
# 7.30 VC 0.50
# 5.80 VC 0.50
# 6.40 VC 0.50
# 10.00 VC 0.50
# 11.20 VC 0.50
# 11.20 VC 0.50
# 5.20 VC 0.50
# 7.00 VC 0.50
# 16.50 VC 1.00
# 16.50 VC 1.00
# 15.20 VC 1.00
# 17.30 VC 1.00
# 22.50 VC 1.00
Note that for large PDF files, it is possible to run up against Java
memory constraints, leading to a java.lang.OutOfMemoryError: Java heap space
error message. Memory can be increased using
options(java.parameters = "-Xmx16000m")
set to some reasonable amount
of memory.
Some other utility functions are also provided (and made possible by the Java Apache PDFBox library):
extract_text()
converts the text of an entire file or specified pages into an R character vector.split_pdf()
andmerge_pdfs()
split and merge PDF documents, respectively.extract_metadata()
extracts PDF metadata as a list.get_n_pages()
determines the number of pages in a document.get_page_dims()
determines the width and height of each page in pt (the unit used byarea
andcolumns
arguments).make_thumbnails()
converts specified pages of a PDF file to image files.
In Power Shell prompt, install Chocolately if you don’t already have it.
Run Get-ExecutionPolicy
. If it returns Restricted
, then run
Set-ExecutionPolicy AllSigned
or Set-ExecutionPolicy Bypass -Scope Process
. Then, install Chocolatey by running the following command:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
Install java using the following command:
choco install openjdk11
You should now be able to safely open R, and use rJava and tabulapdf.
From PowerShell, you should see something like this after running java -version
:
OpenJDK Runtime Environment (build 11.0.22+7-post-Ubuntu-0ubuntu222.04.1)
OpenJDK 64-Bit Server VM (build 11.0.22+7-post-Ubuntu-0ubuntu222.04.1, mixed mode, sharing)
We tested with OpenJDK version 11. The package is configured to ask for
that version of Java. If you have a different version of Java installed,
you may need to change the JAVA_HOME
environment variable to point to
the correct version.
You need to ensure that R has been installed with Java support. This can
often be fixed by running R CMD javareconf
on the command line
(possibly with sudo
).
Make sure you have permission to write to and install packages to your R directory before trying to install the package. This can be changed from “Properties” on the right-click context menu. Alternatively, you can ensure write permission by choosing “Run as administrator” when launching R (again, from the right-click context menu).
- Please report any issues or bugs.
- Get citation information for
tabulapdf
in R doingcitation(package = 'tabulapdf')
- License: Apache