Kevin Wright
2014-Sep-11 20:06 UTC
[R] How to test for open pdf file on Windows before calling cairo_pdf ?
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]]
Henrik Bengtsson
2014-Sep-11 20:56 UTC
[R] How to test for open pdf file on Windows before calling cairo_pdf ?
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.