c#


Starting serverside print job via PHP


This is most likely not an easy one but here is the situation:
I have written a C# command line application which:
creates a PDF using ITextSharp
writes it to disk
uses Acrord32.exe (this is Acrobat Reader) via System.Diagnostics.Process in order to silently print the generated PDF
If I build my solution and double click the pdfGen.exe, it works as expected. The PDF is created and printed.
Now, my app has to be deployed on a internal server with Windows Vista running IIS 7. This server has some PHP webapp running. And it will be called via PHP using shell_exec() so that the resulting PDF will be printed on the printer attached to the server.
So my PHP page looks basically like this:
shell_exec('/path/to/pdfGen.exe');
But here things go wrong. What happens is according to task manager etc.:
pdfGen.exe starts
the PDF is created
Acrord32.exe starts
pdfGen.exe hangs forever (and so does the PHP script) and nothing is printed
I am pretty sure it is some permission related problem. I already gave IIS_IUSRS access to the default printer, and to the directory where Acrord32.exe is located. But still, no printing. However, if I start my pdfGen.exe manually it works.
Any idea what I am missing?
EDIT:
I am not bound to use Acrobat Reader in order to print the PDF. If there is another way in order to silently print the created PDF serverside, I would not mind at all.
In order to check what is going on, try to run
the process monitor from Sysinternals and filter the events to the adobe acrobat process. You will see the system calls of acrobat and it will allow you to know more or less what is going wrong.
I know a small improvement to your solution: SumatraPDF has a nice command-line interface that can be used to auto-close Sumatra after printing.
I used PHP "system" or "exec" functions to execute a batch file to open SumatraPDF:
sumatrapdf.exe -print-to-default -exit-on-print <path_to_PDF_file>
(you can also specify the printer name to print on)
that's an interesting program.
IIS_IUSRS
seems to have no permission to print, try adding IIS_IUSRS to Print Operators Group / grant Print permission to the user.
Shell_exec() is almost intended for shell commands (ls/dir, cp, etc.)
Have you tried to use exec() instead of shell_exec() ?
Thanks all for your comments. Unfortunately this "php start printjob" thing was part of a larger project that was cancelled today because of, well... I dont know... political reasons. Guess the project is pretty much dead.
Anyway, I tried myself a few more times in the last days and could not get it to work with IIS. My solution that I implemented and tested already: remove IIS, install a XAMPP or WAMPP package with a local apache and PHP that runs with admin access rights.
This did the trick. I used pclose(popen('...command...', 'r')); in PHP in order to start the .exe and so that PHP does not wait until the PDF is finished. It all worked great.
Here is my C# code which starts the print job using Acrobat Reader
public void Print(string pathname, string acrobatDirectory)
{
var proc = new Process
{
StartInfo =
{
Arguments = String.Format("/t \"{0}\"", pathname),
FileName = acrobatDirectory,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = false,
RedirectStandardError = false,
}
};
proc.Start();
}
The first argument is the path to the PDF that should be printed, the second parameter is the absolute path to the AcroRd32.exe.
The only problem left was that AcroRd32.exe was started, printed and never got closed again. So every printjob started a new instance of AcroRd32.exe (I am using Acrobat Reader 9.0). So if you printed 10 times, 10 acrobat reader instances were created.
What I did was starting the print job, then waiting X seconds, hoping that the printer was finished and then killing all AcroRd32.exe instances:
public void Print(string pathname, string acrobatDirectory)
{
Debug.WriteLine("Printing...");
Printer.Print(pathname, acrobatDirectory);
Thread.Sleep(30000);
try
{
Debug.WriteLine("Trying to kill runnung AcroRd32.exe's ");
FindAndKillProcess("AcroRd32");
}
catch (Exception)
{
Debug.WriteLine("AcroRd32.exe could not be killed...");
}
}
private bool FindAndKillProcess(string name)
{
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.StartsWith(name))
{
clsProcess.Kill();
return true;
}
}
return false;
}
This worked out quite well.
Note that the above (killing all AcroRd32.exe and running PHP with admin privilegs) was only doable because: The whole thing is only used by one user at a time and has a very limited area of use.
It should be used on a touchscreen application deployed at the clients POS. A salesman would use the PHP app in order to configure a product, and then PHP would call my .exe which would create and print a PDF in the background. The printed document is then handed to the client. So security etc. was not really a concern in this case.
If anyone has a solution in order to use it with IIS, I am still willing to accept it as an answer.

Related Links

Changing A Label's Text In A Click Event For A WPF App [duplicate]
JWT code examples
How do I create a windows service for authentication that custom web applications can use to authenticate AD users?
Testing if ASP Table is Visible
Get list of tables from database
C# control.find explanation
Creating executable COM as ATL project and use it in C#
Supress all violations in Code Analysis Visual studio 2015
How to Save contents of a textbox to a file
Managing Arrays in C# (Memory management)
ASP.NET Web API: any downsides to asynchronous operations?
Use Debug.Log from C++
Comparing only time element with Oracle db using Entity Framework
WebAPI - return file and additional data
Get RMS from FFT
When Include() executing in Entity Framework?

Categories

HOME
repository
ssms
botframework
mobile
cors
process
grpc
dronekit
mediarecorder
annyang
wkhtmltopdf
rename
resharper
github-flavored-markdown
k-means
legend-properties
datasource
webgl-earth
multipart
prepros
handle
ppp
scripting-language
units-of-measurement
apm
ng2-bootstrap
spring-oauth2
choco
imdb
jsonapi-resources
odp.net
azure-vm-scale-set
dotnetnuke-module
linkurious
usernotifications
cowboy
file-conversion
fisheye
compiled-query
glide-image-library
web-technologies
gradlew
gridgain
mef
easyquery
denodo
monaca
ear
cancan
photoshop-script
sharpssh
suitesparse
addressbook
directinput
gevent
toggleclass
mavlink
indoor-positioning-system
strtol
symantec
hdr
django-taggit
user-profile
jcalendar
salesforce-service-cloud
std
controlpanel
producer-consumer
sdkman
gitk
transbase
self-join
personality-insights
identifying
log4cxx
roslyn-code-analysis
web-standards
minko
grunt-contrib-connect
mind-manager
breeze-sharp
visual-c#-express-2010
reactjs-native
infor-eam
acrofields
lastinsertid
qgraphicsscene
mandelbrot
kademlia
symbian3
cloudmade
brew
xcode4.6.3
event-propagation
idtabs
xpolog
lwp
mass-emails
google-local-search
iphone-maps
p4.net
numerical-computing
pkcs#7
file-icons
cons

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App