Can my PDF ping my server when it is opened?

I have a daily cron job that email PDFs to customers. I want to get a measure of how many of those PDF files are opened. What techniques are available?

The standard technique in a web page is to include an img tag with a src reference to a server endpoint that records the ping. But it seems that PDF doesn't allow external image references.

Is there some way to accomplish what I want?

Update: we're considering having the email carry a link to the PDF, but there are reasons we don't want to, so I'm interested to hear other options.


To "call home" you would need a Adobe LiveCycle Policy Server.

Otherwise, if there's a way to embed an external image, that might work for logging purposes, but I don't think that's possible...

Edit, there might be a few methods, including AcroJS. Haven't tested them myself, so I've no idea if they're any good.

Edit 2: As a Linux user, I should point out that both of these non-standard approaches won't work for non Acrobat Reader users.


Perhaps you could take a slightly different approach - have your cron job make the PDF(s) available on a web server somewhere, and then send e-mails including a link to the PDF. That would make it very easy to check how many are actually viewed, from the web server logs.

You've probably already thought of this and discounted it though ;)


You could have the email link to the pdf itself, and use that as the ping you are looking for.


You can take a look at the Adobe Acrobat JavaScript reference http://www.adobe.com/devnet/acrobat/javascript.html. You can use some Ajax inside your PDF document, this document is especially a good reference.

Add some JavaScript to your PDF document and listen for the Doc Open event then (assuming your user are using Adobe Reader version 8 or later) use the Net.SOAP.request method to make a remote procedure call to your service. I haven't tried this before, I only used PDF javascript to post Form result to web services, but I believe that before connecting Adobe Reader will prompt the user to let them an internet connection is being requested.


  • VerifyError: Error #1079: Native methods are not allowed in loaded code
  • Stream webcam via. Wowza streaming server
  • Flex: DataGrid column formatting of numbers
  • Alsa api: how to use mmap in c?
  • Optimal way to set pixel data?
  • Facebook Logout Confusion
  • What is Closure Compiler?
  • What is RSL (Runtime shared library ) used for in flash?
  • Pointer vs Reference difference when passing Eigen objects as arguments
  • LNK1104: cannot open file 'kernel32.lib'
  • Avoid Inheriting Super Class Tests in ScalaTest
  • CSS how to fix an element to scroll horizontally with the page but not vertically?
  • Getting unread count in Sent Folder using Google Apps Script - GMail
  • How can I extend PHP DOMElement?
  • Is it possible to get the word under the mouse cursor in a ``?
  • Installing Perl6 and Panda on Ubuntu 15.10. Problems with bootstrap.pl
  • Two Tables Serving as one Model in Rails
  • Access user's phone number on iOS 7
  • How to retrieve information from antrun back to maven?
  • Pycharm: Marking a folder as 'sources root' is not recursive for subfolders
  • Approximate Order-Preserving Huffman Code
  • GAE: Way to get reference to an HttpSession from its ID?
  • Get history of file changes from TFS to implement custom “blame”-behaviour of exceptions
  • Android full screen on only one activity?
  • Deleting and Updating values from a cusrsor adapter
  • Accessing IRQ description array within a module and displaying action names
  • Get object from AWS S3 as a stream
  • Modifying destination and filename of gulp-svg-sprite
  • 'TypeError' while using NSGA2 to solve Multi-objective prob. from pyopt-sparse in OpenMDAO
  • How can I estimate amount of memory left with calling System.gc()?
  • SVN: Merging two branches together
  • retrieve vertices with no linked edge in arangodb
  • using conditional logic : check if record exists; if it does, update it, if not, create it
  • NSLayoutConstraint that would pin a view to the bottom edge of a superview
  • Understanding cpu registers
  • Change div Background jquery
  • How does Linux kernel interrupt the application?
  • Add sale price programmatically to product variations
  • Busy indicator not showing up in wpf window [duplicate]
  • Why do underscore prefixed variables exist?