2013-09-05 33 views
13

Khi tạo tệp PDF bằng thiết bị đồ họa pdf() trong R, bạn có thể thêm siêu dữ liệu tiêu đề một cách dễ dàng với tiêu đề = đối số sang pdf() . Nhưng không có cách nào rõ ràng để thêm tác giả.Có cách nào để thêm siêu dữ liệu "tác giả" vào pdf được tạo từ R

Nhìn vào mã cho pdf() trong R, khóa có vẻ là hàm C C_PDF, dường như không có đối số tác giả và vượt quá khả năng của tôi để hack. Có cách nào khác, thuận tiện hơn là đan kết xuất đồ họa của tôi thành một tệp PDF do LaTeX tạo, bao gồm thông tin tác giả và lưu chúng tôi thực hiện thủ công sau này không?

.External(C_PDF, file, old$paper, old$family, old$encoding, 
    old$bg, old$fg, old$width, old$height, old$pointsize, 
    onefile, old$pagecentre, old$title, old$fonts, version[1L], 
    version[2L], old$colormodel, old$useDingbats, old$useKerning, 
    old$fillOddEven, old$compress) 

Tôi không có nhiều hy vọng về điều này như không có câu trả lời bằng ngôn ngữ dựa trên thỏa đáng cho this broader question ...

+2

đang kêu gọi một chương trình bên ngoài có thể chấp nhận? exiftool có thể dễ dàng đặt siêu dữ liệu trong tệp PDF được tạo – hrbrmstr

+1

nếu chương trình bên ngoài là một tùy chọn, pdftk cũng có thể làm điều đó quá –

+1

Bạn có thể tìm thấy câu trả lời ở đây: http://stackoverflow.com/questions/24231827/ – Andre

Trả lời

4

Dưới đây là một vài chức năng mà có được và thiết lập siêu dữ liệu Exif cho bất kỳ these filetypes , sử dụng ExifTool.

Để có được siêu dữ liệu:

getexif <- function(file, exiftool='exiftool.exe', opts=NULL, 
        intern=TRUE, simplify=FALSE) { 
    # file: the file to be updated 
    # exiftool: the path to the ExifTool binary 
    # opts: additional arguments to ExifTool (optional) 
    # intern: should a named vector of metadata be returned? (bool) 
    # simplify: if intern==TRUE, should the results be returned as a named 
    #   vector (TRUE) or as a data.frame (FALSE)? 
    arg <- c(opts, normalizePath(file)) 
    if(intern) { 
    exif <- system2(normalizePath(exiftool), args=arg, stdout=TRUE) 
    exif <- do.call(rbind, strsplit(exif, ' +: +', perl=T)) 
    row.names(exif) <- exif[, 1] 
    exif[, 2, drop=simplify] 
    } else { 
    system2(normalizePath(exiftool), args=arg, stdout='') 
    } 
} 

Để thiết lập siêu dữ liệu:

setexif <- function(file, metadata, exiftool='exiftool.exe') { 
    # file: the file to be updated 
    # metadata: a named character vector or list containing metadata 
    # exiftool: the path to the ExifTool binary 
    exif <- sprintf('-%s="%s"', names(metadata), metadata) 
    system2(exiftool, args=c(exif, file)) 
} 

Dưới đây là một ví dụ

pdf(f <- tempfile(fileext='.pdf')) 
plot(runif(10)) 
dev.off() 

toolpath <- 'c:/software/exiftool(-k).exe' 


setexif(f, c(title = "foo", subject='bar', author = "Me"), toolpath) 

getexif(f, toolpath) 

##       [,1]           
## ExifTool Version Number  "9.64"          
## File Name     "file237c6f8d4dac.pdf"      
## Directory     "C:/Users/john/AppData/Local/Temp/RtmpSGqI6O" 
## File Size     "7.8 kB"          
## File Modification Date/Time "2014:06:17 10:50:22+10:00"     
## File Access Date/Time  "2014:06:17 10:50:22+10:00"     
## File Creation Date/Time  "2014:06:17 10:50:20+10:00"     
## File Permissions   "rw-rw-rw-"         
## File Type     "PDF"           
## MIME Type     "application/pdf"        
## PDF Version     "1.4"           
## Linearized     "No"           
## Create Date     "2014:06:17 10:50:20"       
## Modify Date     "2014:06:17 10:50:20"       
## Producer     "R 3.1.0"          
## Creator      "R"           
## Page Count     "1"           
## XMP Toolkit     "Image::ExifTool 9.64"      
## Subject      "bar"           
## Title      "foo"           
## Author      "Me" 
+0

Cảm ơn, có vẻ tuyệt vời nhưng tiếc là tôi không thể sử dụng công cụ bên ngoài vào thời điểm này. Tuy nhiên, nếu chúng ta quyết định theo dõi thì đây là một ưu tiên, ít nhất tôi biết làm thế nào nó có thể được thực hiện. –

+0

@jbaums Công cụ tuyệt vời! Có thể bằng cách nào đó được áp dụng cho một PDF đã tồn tại hoặc một PDF đang được tạo ra trong RMarkdown? – jaySf

+0

@jaySf - chức năng 'setexif' sẽ cho phép bạn cập nhật tài liệu pdf đã tồn tại (đó là ví dụ hiển thị). – jbaums

Các vấn đề liên quan