If you can print once, you can print an infinite number of times.
Consider a network printer: the raw data to be printed has to be sent to a remote embedded device, which your program would have no way of restricting, even if it somehow assumed ownership of the user's entire machine (which would already be considered extremly offensive; see the Sony rootkit scandal for the kind of reaction to expect).
How could you tell the device the user's machine is talking to is a real HP LaserJet, instead of something which pretends to be one (or, even simpler, pretends to be a remote spooler), but which saves the raw PCL/PS/whatever instead of printing it? Since that data is all that is needed to print the job, one would just have to replay it several times to a real printer to get several copies. You could also use a sniffer (as @dlamblin mentioned) and save the trouble of emulating the printer.
You could think of forbidding network printers, but having only network printers in an office (not simple printers attached to a general-purpose PC, but large printers plugged directly into the Ethernet switch) is not that uncommon. Because of that, several of your users (how many would depend heavily on the target demographic) would not be able to print, which is not good PR.
And even USB is not immune (though it would need more technical knowledge and perhaps special hardware); there exist USB sniffers. And even without them, a usb printer "gadget driver" on an embedded Linux device could be enough (note, however, that as of this writing I know of no usb printer gadget driver for Linux).
This is all assuming the program has somehow managed to obtain complete control of the user's machine. As the several failed attempts at copy protection show, this is easier said than done. How can you know that the printer driver you are using is just an uncommon version of the printer driver for a popular brand of printers, and not a hacked version to save the stream to the disk? How can you know there is no driver somewhere in the printing stack logging all the USB transactions to disk? And how can you differentiate a normal user of virtual machines from someone using them to intercept the communication with the USB devices?
All that said, you do not need to go that far. Most people, even if they have the technical know-how, will not attempt to bypass even the weakest attempts at preventing duplicate printing you make. In fact, I would not be surprised if most users would voluntarily not print more than once if told the file must be printed only once (but then there would be more cases of people accidentally printing twice). So, make a simple program which prints once and then erases the original data. Warn the user that the data will be erased after being printed once. And accept that some people will print more times than you allowed, and that some people will print less times than you allowed (power glitches, defective printers, misconfigured systems, or the dreaded PC LOAD LETTER can all cause the printing to fail). Be prepared for that.
For people who print more times than allowed, just accept the losses, the same way a physical shop has to accept that a fraction of its stock will be accidentally damaged or lost in some way. Have some way of finding the biggest abusers and dealing with them (the legal system seems to be a popular choice).
For people who print less times than allowed, something like phone support where the user can request a new copy would be an option (it works for Microsoft, right?). Of course, some people will abuse this, but see the previous paragraph.
One more point: Even if you somehow manage to restrict the user to one printout, what prevents them from just making a photocopy? A photocopy of a laser-printed printout is practically the same as the original printout (it's even more-or-less the same print technology). – sleske – 2010-04-13T10:51:47.490
And I'll just hit printscreen, and your whole concept goes down the toilet. – Fake Name – 2010-07-14T06:02:44.777
6Folly – dlamblin – 2009-09-07T16:18:20.973
Tell me about it ;-) I've been looking at the possibility of using a java applet to handle the printing instead of a PDF, seems like there may be some options down this route, but still doesn't look easy. – pauldunlop – 2009-09-07T16:21:28.127
8In the end, likely neither you nor your client will be happy with how this turns out. Might as well be upfront about it. – emgee – 2009-09-07T17:52:57.477
1Agreed. Just tell him it's not possible. – alex – 2009-09-07T19:04:39.873
1
You should read and understand the question and answers at http://superuser.com/questions/14224/how-to-explain-drm-cannot-work ...
– Chris W. Rea – 2009-09-07T19:18:09.317Thanks all for your help, I know it's essentially an impossible situation, good to get feedback and ideas from everyone. Thanks! – pauldunlop – 2009-09-08T08:55:48.267
Just to add one more nail to the coffin: What about printing to a Printer like the Microsoft XPS Printer or to any other PDF Printer - that gives me an unprotected, digital copy anyway. – Michael Stum – 2009-11-08T06:33:29.470