Хотя вы могли бы избежать этой необходимости, используя R для программной загрузки PDF-файлов, мы можем использовать пакет xattrs
, чтобы получить нужные данные:
library(xattrs) # https://gitlab.com/hrbrmstr/xattrs (not on CRAN)
Давайте посмотрим, какие расширенные атрибуты доступны для этого файла:
xattrs::list_xattrs("~/Downloads/0.-miljoenennota.pdf")
## [1] "com.apple.metadata:kMDItemWhereFroms"
## [2] "com.apple.quarantine"
com.apple.metadata:kMDItemWhereFroms
выглядит как хорошая цель:
xattrs::get_xattr(
path = "~/Downloads/forso/0.-miljoenennota.pdf",
name = "com.apple.metadata:kMDItemWhereFroms"
) -> from_where
from_where
## [1] "bplist00\xa2\001\002_\020}https://www.rijksoverheid.nl/binaries/rijksoverheid/documenten/begrotingen/2016/09/20/miljoenennota-2017/0.-miljoenennota.pdfP\b\v\x8b"
Но это в двоичном формате plist (yay Apple#вздох).Однако, поскольку это «вещь», пакет xattrs
имеет функцию read_bplist()
, но мы должны использовать get_xattr_raw()
, чтобы использовать ее:
xattrs::read_bplist(
xattrs::get_xattr_raw(
path = "~/Downloads/forso/0.-miljoenennota.pdf",
name = "com.apple.metadata:kMDItemWhereFroms"
)
) -> from_where
str(from_where)
## List of 1
## $ plist:List of 1
## ..$ array:List of 2
## .. ..$ string:List of 1
## .. .. ..$ : chr "https://www.rijksoverheid.nl/binaries/rijksoverheid/documenten/begrotingen/2016/09/20/miljoenennota-2017/0.-miljoenennota.pdf"
## .. ..$ string: list()
## ..- attr(*, "version")= chr "1.0"
Уродливый, вложенный список является ошибкойдействительно тупой двоичный формат файла plist, но там есть исходный URL.
Мы можем получить их все таким образом (для этого я поместил кучу случайных интерактивно загруженных PDF-файлов в каталог), используя lapply
.Есть также пример этого в этом сообщении в блоге , но он использует reticulate
и пакет Python для чтения двоичных данных plist вместо встроенной функции пакета, чтобы сделать это (упомянутая встроенная функция пакетаявляется оберткой для утилиты macOS plutil
или linux plistutil
; пользователи Windows могут переключиться на реальную операционную систему, если они захотят использовать эту функцию).
fils <- list.files("~/Downloads/forso", pattern = "\\.pdf", full.names = TRUE)
do.call(
rbind.data.frame,
lapply(fils, function(.x) {
xattrs::read_bplist(
xattrs::get_xattr_raw(
path = .x,
name = "com.apple.metadata:kMDItemWhereFroms"
)
) -> tmp
from_where <- if (length(tmp$plist$array$string) > 0) {
tmp$plist$array$string[[1]]
} else {
NA_character_
}
data.frame(
fil = basename(.x),
url = from_where,
stringsAsFactors=FALSE
)
})
) -> files_with_meta
str(files_with_meta)
## 'data.frame': 9 obs. of 2 variables:
## $ fil: chr "0.-miljoenennota.pdf" "19180242-D02E-47AC-BDB3-73C22D6E1FDB.pdf" "Codebook.pdf" "Elementary-Lunch-Menu.pdf" ...
## $ url: chr "https://www.rijksoverheid.nl/binaries/rijksoverheid/documenten/begrotingen/2016/09/20/miljoenennota-2017/0.-miljoenennota.pdf" "http://eprint.ncl.ac.uk/file_store/production/230123/19180242-D02E-47AC-BDB3-73C22D6E1FDB.pdf" "http://apps.start.umd.edu/gtd/downloads/dataset/Codebook.pdf" "http://www.msad60.org/wp-content/uploads/2017/01/Elementary-February-Lunch-Menu.pdf" ...
ПРИМЕЧАНИЕ.сделать больше пуленепробиваемости в примере lapply
.