From 4ea1bfb6124c3300f3ed2e55ffd082afdf3ffe65 Mon Sep 17 00:00:00 2001 From: Mauricio 'Pacha' Vargas Sepulveda Date: Sun, 28 Apr 2024 23:28:35 -0400 Subject: [PATCH] tabulapdf 1.0.5-2 --- .Rbuildignore | 2 ++ DESCRIPTION | 3 +- NAMESPACE | 2 +- NEWS.md | 6 ++++ R/extract_tables.R | 13 +++---- R/output.R | 10 +++--- dev/errors.R | 8 ++++- inst/examples/text.md | 51 --------------------------- inst/examples/text.pdf | Bin 60524 -> 5225 bytes inst/examples/text.qmd | 11 ++++++ man/extract_tables.Rd | 8 ++--- tests/testthat/test_extract_tables.R | 14 ++++---- tests/testthat/test_extract_text.R | 44 ++++++++--------------- tests/testthat/test_non-latin.R | 15 ++++---- vignettes/tabulapdf.Rmd | 10 +++--- 15 files changed, 79 insertions(+), 118 deletions(-) delete mode 100644 inst/examples/text.md create mode 100644 inst/examples/text.qmd diff --git a/.Rbuildignore b/.Rbuildignore index 70584b9..c5eb406 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -12,3 +12,5 @@ ignore/* ^docs/ ^\.github$ ^codecov\.yml$ +^dev$ +^README\.html$ diff --git a/DESCRIPTION b/DESCRIPTION index 824759b..a3f3ca1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: tabulapdf Type: Package Title: Extract tables from PDF documents -Version: 1.0.5 +Version: 1.0.5-2 Authors@R: c(person("Thomas J.", "Leeper", role = "aut", email = "thosjleeper@gmail.com", @@ -30,6 +30,7 @@ URL: https://docs.ropensci.org/tabulapdf (website) BugReports: https://github.com/ropensci/tabulapdf/issues Imports: png, + readr, rJava, tools, utils diff --git a/NAMESPACE b/NAMESPACE index 79305b2..6252dee 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -22,6 +22,6 @@ importFrom(rJava,.jcall) importFrom(rJava,.jfloat) importFrom(rJava,J) importFrom(rJava,new) +importFrom(readr,read_delim) importFrom(tools,file_path_sans_ext) importFrom(utils,download.file) -importFrom(utils,read.delim) diff --git a/NEWS.md b/NEWS.md index 9974c88..0d0da71 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,9 @@ +# CHANGES TO tabulapdf 1.0.5-2 + +* Uses readr for a much faster parsing of extracted tables. +* The default output format is now a list of tibbles. +* All tests pass. + # CHANGES TO tabulapdf 1.0.5 * Package renamed to `tabulapdf` diff --git a/R/extract_tables.R b/R/extract_tables.R index 6f54708..06a071d 100644 --- a/R/extract_tables.R +++ b/R/extract_tables.R @@ -23,8 +23,8 @@ #' @param \dots These are additional arguments passed to the internal functions dispatched by \code{method}. #' @details This function mimics the behavior of the Tabula command line utility. It returns a list of R character matrices containing tables extracted from a file by default. This response behavior can be changed by using the following options. #' \itemize{ +#' \item \code{output = "tibble"} attempts to coerce the structure returned by \code{method = "character"} into a list of tibbles and returns character strings where this fails. #' \item \code{output = "character"} returns a list of single-element character vectors, where each vector is a tab-delimited, line-separate string of concatenated table cells. -#' \item \code{output = "data.frame"} attempts to coerce the structure returned by \code{method = "character"} into a list of data.frames and returns character strings where this fails. #' \item \code{output = "csv"} writes the tables to comma-separated (CSV) files using Tabula's CSVWriter method in the same directory as the original PDF. \code{method = "tsv"} does the same but with tab-separated (TSV) files using Tabula's TSVWriter and \code{method = "json"} does the same using Tabula's JSONWriter method. Any of these three methods return the path to the directory containing the extract table files. #' \item \code{output = "asis"} returns the Java object reference, which can be useful for debugging or for writing a custom parser. #' } @@ -49,11 +49,12 @@ #' ## part of the table #' extract_tables(f, pages = 2, area = list(c(126, 284, 174, 417))) #' -#' # return data.frames -#' extract_tables(f, pages = 2, output = "data.frame") +#' # return tibbles +#' extract_tables(f, pages = 2, output = "tibble") #' } #' @seealso \code{\link{extract_areas}}, \code{\link{get_page_dims}}, \code{\link{make_thumbnails}}, \code{\link{split_pdf}} -#' @importFrom utils read.delim download.file +#' @importFrom utils download.file +#' @importFrom readr read_delim #' @importFrom tools file_path_sans_ext #' @importFrom rJava J new .jfloat .jcall #' @export @@ -64,7 +65,7 @@ extract_tables <- function(file, guess = TRUE, method = c("decide", "lattice", "stream"), output = c( - "matrix", "data.frame", "character", + "tibble", "matrix", "character", "asis", "csv", "tsv", "json" ), outdir = NULL, @@ -160,7 +161,7 @@ extract_tables <- function(file, "json" = write_jsons(tables, file = file, outdir = outdir, ...), "character" = list_characters(tables, encoding = encoding, ...), "matrix" = list_matrices(tables, encoding = encoding, ...), - "data.frame" = list_data_frames(tables, encoding = encoding, ...), + "tibble" = list_data_frames(tables, encoding = encoding, ...), "asis" = tables, tables ) diff --git a/R/output.R b/R/output.R index 23c5140..47a68fb 100644 --- a/R/output.R +++ b/R/output.R @@ -89,17 +89,17 @@ list_matrices <- function(tables, encoding = NULL, ...) { out } -list_characters <- function(tables, sep = "\t", encoding = NULL, ...) { +list_characters <- function(tables, delim = "\t", encoding = NULL, ...) { m <- list_matrices(tables, encoding = encoding, ...) lapply(m, function(x) { - paste0(apply(x, 1, paste, collapse = sep), collapse = "\n") + paste0(apply(x, 1, paste, collapse = delim), collapse = "\n") }) } -list_data_frames <- function(tables, sep = "\t", stringsAsFactors = FALSE, encoding = NULL, ...) { - char <- list_characters(tables = tables, sep = sep, encoding = encoding) +list_data_frames <- function(tables, delim = "\t", encoding = NULL, ...) { + char <- list_characters(tables = tables, delim = delim, encoding = encoding) lapply(char, function(x) { - o <- try(read.delim(text = x, stringsAsFactors = stringsAsFactors, ...)) + o <- try(read_delim(file = x, delim = delim)) if (inherits(o, "try-error")) { return(x) } else { diff --git a/dev/errors.R b/dev/errors.R index 127978d..ef23aab 100644 --- a/dev/errors.R +++ b/dev/errors.R @@ -2,6 +2,12 @@ library(tabulapdf) -out <- extract_tables("inst/examples/data.pdf", pages = 1, output = "data.frame") +out <- extract_tables("inst/examples/data.pdf", pages = 1, output = "tibble") + +class(out) + +class(out[[1]]) + +library(tibble) out diff --git a/inst/examples/text.md b/inst/examples/text.md deleted file mode 100644 index e174e81..0000000 --- a/inst/examples/text.md +++ /dev/null @@ -1,51 +0,0 @@ -\pagenumbering{gobble} - -To cite R in publications use: - - R Core Team (2018). R: A language and environment for statistical computing. R - Foundation for Statistical Computing, Vienna, Austria. URL - - https://www.R-project.org/. - -A BibTeX entry for LaTeX users is - -``` - @Manual{, - title = {R: A Language and Environment for Statistical Computing}, - author = {{R Core Team}}, - organization = {R Foundation for Statistical Computing}, - address = {Vienna, Austria}, - year = {2018}, - url = {https://www.R-project.org/}, - } -``` - -We have invested a lot of time and effort in creating R, please cite it when -using it for data analysis. See also ‘citation("pkgname")’ for citing R -packages. - -\newpage - -To cite R in publications use: - - R Core Team (2018). R: A language and environment for statistical computing. R - Foundation for Statistical Computing, Vienna, Austria. URL - - https://www.R-project.org/. - -A BibTeX entry for LaTeX users is - -``` - @Manual{, - title = {R: A Language and Environment for Statistical Computing}, - author = {{R Core Team}}, - organization = {R Foundation for Statistical Computing}, - address = {Vienna, Austria}, - year = {2018}, - url = {https://www.R-project.org/}, - } -``` - -We have invested a lot of time and effort in creating R, please cite it when -using it for data analysis. See also ‘citation("pkgname")’ for citing R -packages. diff --git a/inst/examples/text.pdf b/inst/examples/text.pdf index 58bd2e455b5d0160055f125e2a9605ce123541cc..d0d492cfbf3ab6a782a3835af17ddb320bad0342 100644 GIT binary patch literal 5225 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 R36PKxmj>|gXy|DI{tJ78s?7iZ literal 60524 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 diff --git a/inst/examples/text.qmd b/inst/examples/text.qmd new file mode 100644 index 0000000..475165b --- /dev/null +++ b/inst/examples/text.qmd @@ -0,0 +1,11 @@ +--- +format: pdf +--- + +\pagenumbering{gobble} + +42 is the number from which the meaning of life, the universe, and everything can be derived. + +\newpage + +42 is the number from which the meaning of life, the universe, and everything can be derived. diff --git a/man/extract_tables.Rd b/man/extract_tables.Rd index eeb38be..33fe714 100644 --- a/man/extract_tables.Rd +++ b/man/extract_tables.Rd @@ -11,7 +11,7 @@ extract_tables( columns = NULL, guess = TRUE, method = c("decide", "lattice", "stream"), - output = c("matrix", "data.frame", "character", "asis", "csv", "tsv", "json"), + output = c("tibble", "matrix", "character", "asis", "csv", "tsv", "json"), outdir = NULL, password = NULL, encoding = NULL, @@ -62,8 +62,8 @@ Extract tables from a file \details{ This function mimics the behavior of the Tabula command line utility. It returns a list of R character matrices containing tables extracted from a file by default. This response behavior can be changed by using the following options. \itemize{ + \item \code{output = "tibble"} attempts to coerce the structure returned by \code{method = "character"} into a list of tibbles and returns character strings where this fails. \item \code{output = "character"} returns a list of single-element character vectors, where each vector is a tab-delimited, line-separate string of concatenated table cells. - \item \code{output = "data.frame"} attempts to coerce the structure returned by \code{method = "character"} into a list of data.frames and returns character strings where this fails. \item \code{output = "csv"} writes the tables to comma-separated (CSV) files using Tabula's CSVWriter method in the same directory as the original PDF. \code{method = "tsv"} does the same but with tab-separated (TSV) files using Tabula's TSVWriter and \code{method = "json"} does the same using Tabula's JSONWriter method. Any of these three methods return the path to the directory containing the extract table files. \item \code{output = "asis"} returns the Java object reference, which can be useful for debugging or for writing a custom parser. } @@ -86,8 +86,8 @@ extract_tables(f, pages = 2, area = list(c(126, 149, 212, 462))) ## part of the table extract_tables(f, pages = 2, area = list(c(126, 284, 174, 417))) -# return data.frames -extract_tables(f, pages = 2, output = "data.frame") +# return tibbles +extract_tables(f, pages = 2, output = "tibble") } } \references{ diff --git a/tests/testthat/test_extract_tables.R b/tests/testthat/test_extract_tables.R index e4e093b..8d4c03d 100644 --- a/tests/testthat/test_extract_tables.R +++ b/tests/testthat/test_extract_tables.R @@ -5,7 +5,7 @@ sf <- system.file("examples", "data.pdf", package = "tabulapdf") test_that("It basically works", { tab1 <- extract_tables(sf) expect_true(is.list(tab1)) - expect_true(is.matrix(tab1[[1]])) + expect_true(is.data.frame(tab1[[1]])) }) test_that("Warning for ignored arguments", { @@ -30,7 +30,7 @@ test_that("Import from remote file works", { tab2 <- extract_tables(f2) expect_true(is.list(tab2)) expect_true(length(tab2) == 2) - expect_true(is.matrix(tab2[[1]])) + expect_true(is.data.frame(tab2[[1]])) }) test_that("Import from remote non-Western file", { @@ -38,18 +38,18 @@ test_that("Import from remote non-Western file", { tab3 <- extract_tables(f3) expect_true(is.list(tab3)) expect_true(length(tab3) == 1) - expect_true(is.matrix(tab3[[1]])) + expect_true(is.data.frame(tab3[[1]])) }) test_that("Test 'area' argument", { a4a <- list(c(122, 149, 536, 576)) - tab4a <- extract_tables(sf, pages = 1, area = a4a, guess = FALSE, output = "data.frame") + tab4a <- extract_tables(sf, pages = 1, area = a4a, guess = FALSE, output = "tibble") expect_true(is.list(tab4a)) expect_true(is.data.frame(tab4a[[1]])) expect_true(nrow(tab4a[[1]]) == 32) expect_true(ncol(tab4a[[1]]) == 12) a4b <- list(c(122, 149, 251, 464)) - tab4b <- extract_tables(sf, pages = 1, area = a4b, guess = FALSE, output = "data.frame") + tab4b <- extract_tables(sf, pages = 1, area = a4b, guess = FALSE, output = "tibble") expect_true(is.list(tab4b)) expect_true(is.data.frame(tab4b[[1]])) expect_true(nrow(tab4b[[1]]) == 9) @@ -61,7 +61,7 @@ test_that("Test 'columns' argument", { expect_true(is.list(tab5)) expect_true(length(tab5) == 1) expect_true(ncol(tab5[[1]]) == 2) - expect_true(nrow(tab5[[1]]) == 34) + expect_true(nrow(tab5[[1]]) == 33) }) test_that("Extract from encrypted PDF", { @@ -69,7 +69,7 @@ test_that("Extract from encrypted PDF", { expect_error(extract_tables(f6, password = "wrongpassword")) tab6 <- extract_tables(f6, password = "userpassword") expect_true(is.list(tab6)) - expect_true(is.matrix(tab6[[1]])) + expect_true(is.data.frame(tab6[[1]])) }) test_that("Test 'copy' argument", { diff --git a/tests/testthat/test_extract_text.R b/tests/testthat/test_extract_text.R index 91b672b..114e3da 100644 --- a/tests/testthat/test_extract_text.R +++ b/tests/testthat/test_extract_text.R @@ -4,53 +4,39 @@ sf <- system.file("examples", "text.pdf", package = "tabulapdf") test_that("Text can be extracted from the whole document", { txt <- extract_text(sf, encoding = "UTF-8") - cite <- paste(format(citation(), style = "citation"), collapse = "") - striptxt <- gsub("[[:space:]+]", "", txt) - stripcite <- gsub("[[:space:]+]", "", cite) - expect_identical(nchar(striptxt), 2L * nchar(stripcite)) + expect_identical(txt, "42 is the number from which the meaning of life, the universe, and everything can be derived.\n42 is the number from which the meaning of life, the universe, and everything can be derived.\n") }) test_that("'page' argument in extract_text works", { txt <- extract_text(sf, pages = 1, encoding = "UTF-8") - cite <- paste(format(citation(), style = "citation"), collapse = "") - striptxt <- gsub("[[:space:]+]", "", txt) - stripcite <- gsub("[[:space:]+]", "", cite) - expect_identical(nchar(striptxt), nchar(stripcite)) + expect_identical(txt, "42 is the number from which the meaning of life, the universe, and everything can be derived.\n") }) test_that("'area' argument in extract_text works", { - txt <- extract_text(sf, area = list(c(209.4, 140.5, 304.2, 500.8)), encoding = "UTF-8") - txt <- paste(txt, collapse = "") - bibtex <- paste(as.character(toBibtex(citation())), collapse = "") - striptxt <- gsub("[[:space:]+]", "", txt) - stripbib <- gsub("[[:space:]+]", "", bibtex) - expect_identical(nchar(striptxt), 2L * nchar(stripbib)) + txt <- extract_text(sf, area = list(c(10, 15, 100, 550)), encoding = "UTF-8") + expect_identical(txt[1], "42 is the number from which the meaning of life, the universe, and everything can be derived.\n") }) test_that("'area' and 'page' arguments in extract_text work together", { - txt <- extract_text(sf, pages = 1, area = list(c(209.4, 140.5, 304.2, 500.8)), encoding = "UTF-8") - bibtex <- paste(as.character(toBibtex(citation())), collapse = "") - striptxt <- gsub("[[:space:]+]", "", txt) - stripbib <- gsub("[[:space:]+]", "", bibtex) - expect_identical(nchar(striptxt), nchar(stripbib)) + txt <- extract_text(sf, pages = 1, area = list(c(10, 15, 100, 550)), encoding = "UTF-8") + expect_identical(txt, "42 is the number from which the meaning of life, the universe, and everything can be derived.\n") }) test_that("Multiple pages with different areas can be extracted", { txt <- extract_text(sf, pages = c(1, 2), area = list( - c(124, 131, 341.6, 504.3), - c(209.4, 140.5, 304.2, 500.8) + c(10, 15, 100, 550), + c(10, 15, 100, 500) ), encoding = "UTF-8" ) - txt <- paste(txt, collapse = "") - cite <- paste(format(citation(), style = "citation"), collapse = "") - bibtex <- paste(as.character(toBibtex(citation())), collapse = "") - striptxt <- gsub("[[:space:]+]", "", txt) - stripcite <- gsub("[[:space:]+]", "", cite) - stripbib <- gsub("[[:space:]+]", "", bibtex) - bothpages <- paste0(stripcite, stripbib) - expect_identical(nchar(striptxt), nchar(bothpages)) + expect_identical( + txt, + c( + "42 is the number from which the meaning of life, the universe, and everything can be derived.\n", + "42 is the number from which the meaning of life, the universe, and everything can be deriv\n" + ) + ) }) test_that("Test 'copy' argument", { diff --git a/tests/testthat/test_non-latin.R b/tests/testthat/test_non-latin.R index f91c290..38382ee 100644 --- a/tests/testthat/test_non-latin.R +++ b/tests/testthat/test_non-latin.R @@ -2,18 +2,17 @@ context("Non-latin character tests") test_that("Read Spanish language PDF", { f1 <- "https://github.com/tabulapdf/tabula-java/raw/98957221950af4b90620b51a29e0bbe502eea9ad/src/test/resources/technology/tabula/argentina_diputados_voting_record.pdf" - expect_true(is.matrix(extract_tables(f1, pages = 1, area = list(c(269.875, 12.75, 790.5, 561)), guess = FALSE)[[1]])) - t1a <- extract_tables(f1, pages = 1, area = list(c(269.875, 12.75, 790.5, 561)), guess = FALSE, output = "data.frame", encoding = "latin1") - #expect_true(names(t1a[[1]])[2] == "Frente.CÃ.vico.por.Santiago", label = "latin1 encoding worked") - t1b <- extract_tables(f1, pages = 1, area = list(c(269.875, 12.75, 790.5, 561)), guess = FALSE, output = "data.frame", encoding = "UTF-8") - #expect_true(names(t1b[[1]])[2] == "Frente.Cívico.por.Santiago", label = "UTF-8 encoding worked") - + t1 <- extract_tables(f1, pages = 1, area = list(c(269.875, 12.75, 790.5, 561)), guess = FALSE) + t1a <- extract_tables(f1, pages = 1, area = list(c(269.875, 12.75, 790.5, 561)), guess = FALSE, output = "tibble", encoding = "latin1") + t1b <- extract_tables(f1, pages = 1, area = list(c(269.875, 12.75, 790.5, 561)), guess = FALSE, output = "tibble", encoding = "UTF-8") + expect_true(is.data.frame(t1[[1]])) + expect_true(is.data.frame(t1a[[1]])) + expect_true(is.data.frame(t1b[[1]])) }) test_that("Read French language PDF w/correct encoding", { f2 <- "http://www.europarl.europa.eu/oeil/popups/printfichetechnical.pdf?id=673511&lang=fr" t2a <- extract_text(f2, page = 1, encoding = "latin1") t2b <- extract_text(f2, page = 1, encoding = "UTF-8") - #expect_true(nchar(strsplit(t2a, "\n")[[1]][1]) == 50, label = "latin1 encoding worked") - #expect_true(nchar(strsplit(t2b, "\n")[[1]][1]) == 47, label = "UTF-8 encoding worked") + expect_false(t2a == t2b) }) diff --git a/vignettes/tabulapdf.Rmd b/vignettes/tabulapdf.Rmd index 1ff49ff..dc2d5a7 100644 --- a/vignettes/tabulapdf.Rmd +++ b/vignettes/tabulapdf.Rmd @@ -63,7 +63,7 @@ By default, `extract_tables()` returns a list of character matrices. This is bec ```{r} # attempt to coerce tables to data.frames -extract_tables(f, pages = 2, output = "data.frame") +extract_tables(f, pages = 2, output = "tibble") ``` Tabula itself implements three "writer" methods that write extracted tables to disk as CSV, TSV, or JSON files. These can be specified by `output = "csv"`, `output = "tsv"`, and `output = "json"`, respectively. For CSV and TSV, one file is written to disk for each table and R session's temporary directory `tempdir()` is used by default (alternatively, the directory can be specified through `output` argument). For JSON, one file is written containing information about all tables. For these methods, `extract_tables()` returns a path to the directory containing the output files. @@ -80,16 +80,16 @@ If none of the standard methods works well, you can specify `output = "asis"` to By default, tabulapdf uses Tabula's table detection algorithm to automatically identify tables within each page of a PDF. This automatic detection can be toggled off by setting `guess = FALSE` and specifying an "area" within each PDF page to extract the table from. Here is a comparison of the default settings, versus extracting from two alternative areas within a page: ```{r} -str(extract_tables(f, pages = 2, guess = TRUE, output = "data.frame")) -str(extract_tables(f, pages = 2, area = list(c(126, 149, 212, 462)), guess = FALSE, output = "data.frame")) -str(extract_tables(f, pages = 2, area = list(c(126, 284, 174, 417)), guess = FALSE, output = "data.frame")) +str(extract_tables(f, pages = 2, guess = TRUE, output = "tibble")) +str(extract_tables(f, pages = 2, area = list(c(126, 149, 212, 462)), guess = FALSE, output = "tibble")) +str(extract_tables(f, pages = 2, area = list(c(126, 284, 174, 417)), guess = FALSE, output = "tibble")) ``` The `area` argument should be a list either of length 1 (to use the same area for each specified page) or equal to the number of pages specified. This also means that you can extract multiple areas from one page, but specifying the page twice and indicating the two areas separately: ```{r} a2 <- list(c(126, 149, 212, 462), c(126, 284, 174, 417)) -str(extract_tables(f, pages = c(2, 2), area = a2, guess = FALSE, output = "data.frame")) +str(extract_tables(f, pages = c(2, 2), area = a2, guess = FALSE, output = "tibble")) ``` ## Interactive Table Extraction ##