[R] How to test for open pdf file on Windows before calling cairo_pdf ?

Henrik Bengtsson hb at biostat.ucsf.edu
Thu Sep 11 22:56:52 CEST 2014


A poor mans solution would be to try to temporarily delete or move the
file, depending exactly what you wish to do. You can also try:

library("R.utils")
pathname <- Arguments$getWritablePathname("file2.pdf", mustNotExist=FALSE)

which does lots of assertions of write permissions of new and existing
file, in the target directory etc. and tries to give an informative
error if it fails.  However, it does not have a particular
test/message for "locked" PDF files.  This is the error message I get
when I view a PDF in Adobe Reader on Windows:

> pathname <- Arguments$getWritablePathname("file2.pdf", mustNotExist=FALSE)
[2014-09-11 13:42:14] Exception: No permission to modify existing file: file2.pd
f

  at #03. getWritablePathname.Arguments(static, ...)
          - getWritablePathname.Arguments() is in environment 'R.utils'

  at #02. getWritablePathname(static, ...)
          - getWritablePathname() is in environment 'R.utils'
          - originating from '<text>'

  at #01. Arguments$getWritablePathname("file2.pdf", mustNotExist = FALSE)
          - Arguments$getWritablePathname() is local of the calling function

Error: No permission to modify existing file: file2.pdf
In addition: Warning message:
In fileAccess.default(pathname, mode = 2) :
  file.access(..., mode=2) and file(..., open="ab") gives different
results (0 != -1). Will use the file() results: file2.pdf


Note that it is not all PDF viewers that lock/prevent files from being
overwritten.  For instance, when I view the same file using Foxit
Reader, I don't get an error, e.g.

library("R.utils")
pathname <- Arguments$getWritablePathname("file2.pdf", mustNotExist=FALSE)
pdf(pathname)
plot(1:10)
dev.off()


Better yet, just use the R.devices package
[http://cran.r-project.org/web/packages/R.devices/index.html] and
it'll all be take care of for you:

library("R.devices")
devEval("png", name="file1", {
  plot(1:10)
})

library("R.devices")
devEval("cairo_pdf", name="file2", {
  plot(1:10)
}, ext="pdf")

You'll get the above error message if, say, Adobe Reader is preventing
the file from being overwritten.  This approach will make sure to
close any opened graphics devices, not to leave incomplete image files
behind if there is an errors and so on.  There are plenty of option
for it, e.g. the default output directory is "./figures/", which can
be changed.  (The need for argument ext="pdf" is due to a minor bug
that will be fixed in the next release.)


Hope this helps,

Henrik
(author of R.utils and R.devices)

On Thu, Sep 11, 2014 at 1:06 PM, Kevin Wright <kw.stat at gmail.com> wrote:
> On Windows:
>
> The pdf("file1.pdf") command will throw an error if the file1.pdf is open
> in a viewer.  For example:
>
> pdf("file1.pdf")
> plot(1:10)
> dev.off()
> shell.exec("file1.pdf")
> pdf("file1.pdf") # Causes an error
>
> As suggested by the help page for file.access(), I normally use
> try(pdf("file1.pdf")) to test if file1.pdf is open.
>
> Oddly, I cannot do the same using cairo_pdf.  For example:
>
> cairo_pdf("file2.pdf")
> plot(1:10)
> dev.off()
> shell.exec("file2.pdf")
> cairo_pdf("file2.pdf") # No error
>
> It is not until a plotting command is called that an error is generated.
>
> Is there a way to test if a pdf file can be written to by cairo_pdf ?
>
> I'd rather not wrap all plotting commands with try()....I have many such
> commands in my script and the choice of which one is first depends on user
> input.
>
> Kevin Wright
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list