Как добавить сюжет к существующему файлу PDF
Я хочу добавить сюжет к существующему PDF файлу после того, как dev.off()
был вызван *. После прочтения pdf()
файл справки и после прочтения Q и A здесь и здесь, я довольно уверен, что это невозможно сделать в Р. Но, возможно, у некоторых из вас умнее людей есть решение, которое я не смог найти.
pdf("Append to me.%03d.pdf",onefile=T)
plot(1:10,10:1) #First plot (page 1)
dev.off()
pdf("Append to me.%03d.pdf",onefile=T)
plot(1:10,rep(5,10)) #Want this one on page 2
dev.off()
* Это не дубликат вопросов, связанных выше, потому что я хочу, чтобы добавить в файл PDF <я > после устройство PDF было закрыто.
Ответы
Ответ 1
Вы можете использовать recordPlot
для хранения каждого графика в list
, а затем записать их в pdf файл в конце с помощью replayPlot
. Вот пример:
num.plots <- 5
my.plots <- vector(num.plots, mode='list')
for (i in 1:num.plots) {
plot(i)
my.plots[[i]] <- recordPlot()
}
graphics.off()
pdf('myplots.pdf', onefile=TRUE)
for (my.plot in my.plots) {
replayPlot(my.plot)
}
graphics.off()
Ответ 2
Если вы хотите установить небольшую бесплатную независимую от платформы pdftk, вы можете использовать системный вызов от R до пусть он сшит все ваши фигуры вместе:
## A couple of example pdf docs
pdf("Append to me.1.pdf")
plot(1:10,10:1)
dev.off()
pdf("Append to me.2.pdf")
plot(1:10,rep(5,10))
dev.off()
## Collect the names of the figures to be glued together
ff <- dir(pattern="Append to me")
## The name of the pdf doc that will contain all the figures
outFileName <- "AllFigs.pdf"
## Make a system call to pdftk
system2(command = "pdftk",
args = c(shQuote(ff), "cat output", shQuote(outFileName)))
## The command above is equiv. to typing the following at the system command line
## pdftk "Append to me.1.pdf" "Append to me.2.pdf" cat output "AllFigs.pdf"
Ответ 3
Это ужасно хаки и, вероятно, противоречит моей ограниченной оболочке UNIX, но она работает для меня в ящике Fedora 17 с пакетом pdfjam установлен (не R-пакет, а из репозитория YUM)
pdf("pdf1.pdf")
plot(1:10)
dev.off()
pdf("| pdfjoin --outfile \"pdf2.pdf\" && pdfjoin pdf1.pdf pdf2.pdf --outfile pdf1.pdf && rm pdf2.pdf")
plot(10:1)
dev.off()
Выход в R:
> pdf("| pdfjoin --outfile \"pdf2.pdf\" && pdfjoin pdf1.pdf pdf2.pdf --outfile pdf1.pdf && rm pdf2.pdf")## && pdfunite joined.pdf tmp.pdf joined.pdf && rm tmp.pdf")
> plot(10:1)
> dev.off()
----
pdfjam: This is pdfjam version 2.08.
pdfjam: Reading any site-wide or user-specific defaults...
(none found)
pdfjam: No PDF/JPG/PNG source specified: input is from stdin.
pdfjam: Effective call for this run of pdfjam:
/usr/bin/pdfjam --fitpaper 'true' --rotateoversize 'true' --suffix joined --outfile pdf2.pdf -- /dev/stdin -
pdfjam: Calling pdflatex...
pdfjam: Finished. Output was to 'pdf2.pdf'.
----
pdfjam: This is pdfjam version 2.08.
pdfjam: Reading any site-wide or user-specific defaults...
(none found)
pdfjam: Effective call for this run of pdfjam:
/usr/bin/pdfjam --fitpaper 'true' --rotateoversize 'true' --suffix joined --outfile pdf1.pdf -- pdf1.pdf - pdf2.pdf -
pdfjam: Calling pdflatex...
pdfjam: Finished. Output was to 'pdf1.pdf'.
null device
1
В принципе, pdfjoin
будет принимать входные данные из stdin
, если это единственный входной файл, поэтому я передаю вывод из pdf()
в программу pdfjoin
и задаю выходной файл с помощью аргумента --outfile
. Затем с помощью &&
присоединяется исходный pdf1.pdf
только что созданный pdf2.pdf
, указав, что выходной PDF pdf1.pdf
, имя исходного PDF.
Ответ 4
Недавно я нашел эту отличную работу (не пытаюсь утверждать ее как свою).
https://jonkimanalyze.wordpress.com/2014/07/24/r-compile-png-files-into-pdf/
Это не совсем то, о чем просил OP, но причина, по которой мне это нравится, заключается в том, что у меня часто есть довольно плотные диаграммы рассеяния и другие сюжеты, которые не особенно хорошо реагируют на изменение размера окна и т.д. в формате pdf. Однако мне нужно создать многостраничный вывод. Поэтому, если графики плотны по плотности, я делаю их как .png, а затем использую указанную выше функцию для рекомбинации в конце.
merge.png.pdf <- function(pdfFile, pngFiles, deletePngFiles=FALSE) {
pdf(pdfFile)
n <- length(pngFiles)
for( i in 1:n) {
pngFile <- pngFiles[i]
pngRaster <- readPNG(pngFile)
grid.raster(pngRaster, width=unit(0.8, "npc"), height= unit(0.8, "npc"))
if (i < n) plot.new()
}
dev.off()
if (deletePngFiles) {
unlink(pngFiles)
}
}
Ответ 5
pdf("myFile.pdf",onefile=T)
plot(1:10,10:1) #First plot (page 1)
plot(1:10,rep(5,10)) #Want this one on page 2
dev.off()