exiftool detection is now cached for the rest of the session after the first
successful detection rather than being repeated by every supports_exiftool() call
and every internal exiftool invocation.
Previously exiftoolr::configure_exiftoolr() (which spawns perl and exiftool
subprocesses) was re-run several times per set_xmp()/set_docinfo() call and
could account for most of their runtime.
The cache still honors the xmpdf_disable_exiftool option, is invalidated
if the ET_EXIFTOOL_PATH or ET_PERL_PATH environment variables change,
and is bypassed if the cached command no longer exists.supports_exiftool() now returns a scalar when exiftoolr detects exiftool
as a two-element perl + script command.
Previously exiftool-backed functions could error with "the condition has length > 1".exiftool detection (when exiftoolr is not installed) and pdftk detection now treat
an ET_EXIFTOOL_PATH / PDFTK_PATH environment variable that is set but empty as unset
and fall back to looking for the tool on the PATH.New get_bookmarks_augmented() which augments get_bookmarks_pdftk()'s support
for bookmark page numbers with get_bookmarks_pdftools()'s new support for
whether bookmarks should start open or closed (#62).
docinfo() objects now support arbitrary (non-standard) info dictionary entries (#7).
Read/write support among the various backends is as follows:
get_docinfo_pdftk()/set_docinfo_pdftk() support reading and writing them.get_docinfo_exiftool()/set_docinfo_exiftool() support reading and writing them.get_docinfo_pdftools() supports reading them.set_docinfo_gs() supports writing them.set_bookmarks() bug where tempfile wasn't being deleted if input == output (@djvill, #63).get_bookmarks_pdftools() now reports positive/negative count
(as well as open) using pdftools::pdf_toc()'s new is_open list element (#62).
This requires pdftools (>= 3.8.0).get_bookmarks() now prefers the new get_bookmarks_augmented() when supported.pdftk command-line tool to read bookmark/documentation info metadata
now time out after 60s by default (configurable via the xmpdf_pdftk_timeout option)
rather than being able to hang indefinitely on a pathological pdf outline.get_bookmarks_pdftools() gets pdf bookmark information using pdftools::pdf_toc() (#30).
Note though due to poppler library limitations it can't return page numbers that correspond to each bookmark.
Hence get_bookmarks() will try to use the following helper functions in the following order:
get_bookmarks_pdftk()get_bookmarks_pdftools()set_bookmarks_gs() for the newest versions of ghostscript (#59).
The new approach means we could remove some GPLv3 code and have relicensed the package under the MIT license.get_bookmarks() and get_bookmarks_pdftk() no longer returns its data frame value invisibly.set_docinfo_exiftool() should now losslessly write all legal datetimes (#55).
set_docinfo()'s priority order has been updated to the following:
set_docinfo_exiftool()set_docinfo_gs()set_docinfo_pdftk()Unit tests have been adjusted to prevent CRAN R CMD check ERRORs on certain CRAN platforms
that don't have ghostscript installed or are ran in a non-Unicode locale (#56).
cat_bookmarks() concatenates a list of bookmarks
into a single bookmarks data frame while updating the page numbers.
Useful if wanting to concatenate multiple pdf files together and
would like to preserve the bookmarks information.
get_bookmarks() returns a data frame with pdf bookmarks information.
get_bookmarks() will try to use the following helper functions in the following order:
get_bookmarks_pdftk() which wraps pdftk command-line toolset_bookmarks() sets (replaces) pdf bookmarks information.
set_bookmarks() will try to use the following helper functions in the following order:
set_bookmarks_gs() which wraps ghostscript command-line toolset_bookmarks_pdftk() which wraps pdftk command-line tooldocinfo() provides an {R6} object to represent pdf documentation info entries.
as_docinfo() can coerce objects into docinfo() objects.
In particular there is an as_docinfo.xmp() method to coerce xmp() objects.
get_docinfo() reads in pdf documentation info entries from pdf file(s).
get_docinfo() will try to use the following helper functions in the following order:
get_docinfo_pdftk() which wraps pdftk command-line toolget_docinfo_exiftool() which wraps exiftool command-line toolget_docinfo_pdftools() which wraps pdftools::pdf_info()set_docinfo() sets pdf documentation info entries to a pdf file.
set_docinfo() will try to use the following helper functions in the following order:
set_docinfo_gs() which wraps ghostscript command-line toolset_docinfo_pdftk() which wraps pdftk command-line toolset_docinfo_exiftool() which wraps exiftool command-line toolxmp() provides an {R6} object to represent xmp metadata.
as_lang_alt() supports "language alternative" XMP tags.as_xmp() can coerce objects into xmp() objects.
In particular there is an as_xmp.docinfo() method to coerce docinfo() objects.
get_xmp() reads in xmp metadata from media file(s).
get_xmp() will try to use the following helper functions in the following order:
get_xmp_exiftool() which wraps exiftool command-line toolset_xmp() sets xmp metadata in media file(s).
set_xmp() will try to use the following helper functions in the following order:
set_xmp_exiftool() which wraps exiftool command-line toolcat_pages() concatenates (pdf) file(s) into a single output pdf.
cat_pages() will try to use the following helper functions in the following order:
cat_pages_qpdf() which wraps qpdf::pdf_combine()cat_pages_pdftk() which wraps pdftk command-line toolcat_pages_gs() which wraps ghostscript command-line tooln_pages() returns the number of pages in the (pdf) file(s).
n_pages() will try to use the following helper functions in the following order:
n_pages_qpdf() which wraps qpdf::pdf_length()n_pages_exiftool() which wraps exiftool command-line tooln_pages_pdftk() which wraps pdftk command-line tooln_pages_gs() which wraps ghostscript command-line toolThe following functions detect support for various higher-level features:
supports_get_bookmarks()supports_set_bookmarks()supports_get_docinfo()supports_set_docinfo()supports_get_xmp()supports_set_xmp()supports_n_pages()The following functions detect support for various command-line tools needed for some lower-level helper functions:
supports_exiftool() detects support for exiftoolsupports_gs() detects support for ghostscriptsupports_pdftk() detects support for pdftkenable_feature_message() returns a character vector with the
information needed to install the requested feature.
Formatted for use with rlang::abort(), rlang::warn(), or rlang::inform().
The spdx_licenses data set contains the SPDX License List.