web-dev-qa-db-fra.com

Comment ajouter une parcelle à un fichier pdf existant

Je souhaite annexer un tracé à un fichier pdf existant longtemps après que dev.off() a été appelé *. Après avoir lu le fichier d'aide pdf() et après avoir lu le Q & A ici et ici , je suis presque sûr que cela ne peut pas être fait dans R. que je n'ai pas pu trouver.

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()

* Ceci n'est pas un duplicata des questions liées ci-dessus parce que je veux ajouter à un fichier pdf après le périphérique pdf a été fermé.

29
D. Woods

Vous pouvez utiliser recordPlot pour stocker chaque tracé dans une list, puis les écrire dans un fichier pdf à la fin avec replayPlot. Voici un exemple:

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()
20
Matthew Plourde

Si vous souhaitez installer le petit, gratuit, indépendant de la plate-forme pdftk utililty, vous pouvez utiliser un appel système de R pour le faire assembler tous vos chiffres:

## 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"
17
Josh O'Brien

Ceci est horriblement hacky et dément probablement mon fu UNIX Shell limité, mais cela fonctionne pour moi sur une boîte Fedora 17 avec le pdfjam package installé (pas un package R, mais à partir du référentiel 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()

La sortie dans R est:

> 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

Fondamentalement, pdfjoin prendra l'entrée de stdin s'il s'agit du seul fichier d'entrée. Par conséquent, je dirige la sortie de pdf() vers le programme pdfjoin et spécifie le fichier de sortie à l'aide de l'argument --outfile. Ensuite, en utilisant &&, vous rejoignez le pdf1.pdf d'origine avec le pdf2.pdf que vous venez de créer, en spécifiant que la sortie PDF est pdf1.pdf, le nom du fichier PDF d'origine.

6
Gavin Simpson

J'ai trouvé cet excellent travail récemment (sans tenter de le revendiquer comme étant le mien)

https://jonkimanalyze.wordpress.com/2014/07/24/r-compile-png-files-into-pdf/

Ce n’est pas tout à fait ce que demandait le PO, mais la raison pour laquelle j’ai aimé, c’est que j’ai souvent des nuages ​​de dispersion très denses et d’autres graphiques qui ne répondent pas particulièrement bien au redimensionnement de la fenêtre, etc. Cependant, je dois produire une sortie multi-pages. Donc, si les tracés sont riches en données, je les convertis en fichiers .pngs, puis j'utilise la fonction ci-dessus pour recombiner à la fin.

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)
  }

}
1
Pascoe