Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

closing an instance of acrobat reader from command line

I am using the following cmd to print the pdf:

acroRD32.exe /t "file1.pdf" "printerName"

Everything works fine but one window pops up. Can anybody help me to disable it. I tried with various options included in this question but cannot succeed.

Any help is appreciated.

like image 313
user234194 Avatar asked Feb 22 '11 23:02

user234194


People also ask

How do I close Adobe Acrobat Reader?

Answer: A: Option + Command + esc brings up Force Quit panel.

How do I close Adobe Acrobat when it is frozen?

1- In such case where application is completely frozen, try opening Activity monitor (Mac), Task Manager(Win) and close the Acrobat Reader processes running in the background or you have to force reboot the system.

How do you close a hanging PDF?

All replies. You can FORCE QUIT the app that had frozen with the PDF document. The way you can do that is by pushing and holding down the OPTION key and then right clicking on the app that is frozen (For example, Acrobat Reader). That will display the option to Force Quit the app.


3 Answers

Why even use Acrobat at all? This class that print silently for you without any executables or even a printer setup:

Sample Usage:
bool isPrinted = BatchPrint.PrintBinaryFile("file path", "Printer IP Address", "Queue Name", "User");


public class BatchPrint
{

    private const int cPort = 515;
    private const char cLineFeed = '\n';
    private const int cDefaultByteSize = 4;
    public static string ErrorMessage = string.Empty;
    private static string mHost;
    private static string mQueue;
    private static string mUser;
    private static readonly Queue mPrintQueue = new Queue();
    private static readonly Dictionary<string, int> mLastPrintId = new Dictionary<string, int>();

    public static bool PrintBinaryFile(string filePath, string printerName, string queueName, string userName)
    {
        try
        {
            mHost = printerName;
            mQueue = queueName;
            mUser = userName;
            BeginPrint(filePath);
        }
        catch (Exception ex)
        {
            ErrorMessage += ex.Message + cLineFeed + ex.StackTrace;
        }
        return ErrorMessage.Length <= 0;
    }

    private static void BeginPrint(string filePath)
    {      
        mPrintQueue.Enqueue(filePath);
        ThreadStart myThreadDelegate = SendFileToPrinter;
        var myThread = new Thread(myThreadDelegate);
        myThread.Start();
    }

    private static void SendFileToPrinter()
    {
        ErrorMessage = string.Empty;
        var fileFromQueue = (string)mPrintQueue.Dequeue();
        var tcpClient = new TcpClient();
        tcpClient.Connect(mHost, cPort);
        const char space = ' ';
        using (var networkStream = tcpClient.GetStream())
        {
            if (!networkStream.CanWrite)
            {
                ErrorMessage = "NetworkStream.CanWrite failed";
                networkStream.Close();
                tcpClient.Close();
                return;
            }
            var thisPc = Dns.GetHostName();
            var printId = GetPrintId();
            var dfA = string.Format("dfA{0}{1}", printId, thisPc);
            var cfA = string.Format("cfA{0}{1}", printId, thisPc);
            var controlFile = string.Format("H{0}\nP{1}\n{5}{2}\nU{3}\nN{4}\n", thisPc, mUser, dfA, dfA, Path.GetFileName(fileFromQueue), true);
            const int bufferSize = (cDefaultByteSize * 1024);
            var buffer = new byte[bufferSize];
            var acknowledgement = new byte[cDefaultByteSize];
            var position = 0;
            buffer[position++] = 2;
            ProcessBuffer(mQueue, ref buffer, ref position, (byte)cLineFeed);
            if (!IsAcknowledgementValid(buffer, position, acknowledgement, networkStream, tcpClient, "No response from printer"))
                return;               
            position = 0;
            buffer[position++] = 2;
            var cFileLength = controlFile.Length.ToString();
            ProcessBuffer(cFileLength, ref buffer, ref position, (byte)space);
            ProcessBuffer(cfA, ref buffer, ref position, (byte)cLineFeed);
            if (!IsAcknowledgementValid(buffer, position, acknowledgement, networkStream, tcpClient, "Error on control file len"))
                return;
            position = 0;
            ProcessBuffer(controlFile, ref buffer, ref position, 0); 
            if (!IsAcknowledgementValid(buffer, position, acknowledgement, networkStream, tcpClient, "Error on control file"))
                return;
            position = 0;
            buffer[position++] = 3;
            var dataFileInfo = new FileInfo(fileFromQueue);
            cFileLength = dataFileInfo.Length.ToString();
            ProcessBuffer(cFileLength, ref buffer, ref position, (byte)space);
            ProcessBuffer(dfA, ref buffer, ref position, (byte)cLineFeed);
            if (!IsAcknowledgementValid(buffer, position, acknowledgement, networkStream, tcpClient, "Error on dfA"))
                return;              
            long totalbytes = 0;
            using (var fileStream = new FileStream(fileFromQueue, FileMode.Open))
            {
                int bytesRead;
                while ((bytesRead = fileStream.Read(buffer, 0, bufferSize)) > 0)
                {
                    totalbytes += bytesRead;
                    networkStream.Write(buffer, 0, bytesRead);
                    networkStream.Flush();
                }
                fileStream.Close();
            }
            if (dataFileInfo.Length != totalbytes)
                ErrorMessage = fileFromQueue + "File length error";
            position = 0;
            buffer[position++] = 0;
            if (!IsAcknowledgementValid(buffer, position, acknowledgement, networkStream, tcpClient, "Error on file"))
                return;
            networkStream.Close();
            tcpClient.Close();
        }
    }

    private static int GetPrintId()
    {
        var count = 0;
        lock (mLastPrintId)
        {
            if (mLastPrintId.ContainsKey(mUser))
                count = mLastPrintId[mUser];
            count++;          
            count %= 1000; 
            if (mLastPrintId.ContainsKey(mUser))
                mLastPrintId[mUser] = count;
            else
                mLastPrintId.Add(mUser, count);
        }
        return count;
    }

    private static void ProcessBuffer(string item, ref byte[] buffer, ref int position, byte nextPosition)
    {
        foreach (var t in item)
        {
            buffer[position++] = (byte)t;
        }
        buffer[position++] = nextPosition;
    }

    private static bool IsAcknowledgementValid(byte[] buffer, int position, byte[] acknowledgement, NetworkStream networkStream, TcpClient tcpClient, string errorMsg)
    {
        networkStream.Write(buffer, 0, position);
        networkStream.Flush();
        networkStream.Read(acknowledgement, 0, cDefaultByteSize);
        if (acknowledgement[0] == 0) 
            return true;
        ErrorMessage = errorMsg;
        networkStream.Close();
        tcpClient.Close();
        return false;
    }

}
like image 127
Buzz Wilder Avatar answered Nov 10 '22 02:11

Buzz Wilder


You cannot close the last open Acrobat window through the command line. From ancient history of programming scripts for Acrobat, I believe that there is no way to do this in an Acrobat script, either.

But you can close Acrobat from the command line, though it is a bit convoluted. For a pure MSDOS method for most Windows systems, create two files: called.bat and caller.bat.

caller.bat:

REM call the batch file that runs the program:
start "ProgramRunner" called.bat

REM wait 5 seconds -- if this closes Acrobat too soon, then increase the time:
ping 1.1.1.1 -n 1 -w 5000 >nul

REM kill the called program -- should be the program name that was started in called.bat:
REM (If the program does not close, type "taskkill /?" in the command line to see options.)
taskkill /F /IM acroRD32.exe

called.bat

"path\to\the\program\acroRD32.exe" /t "path\to\the\program\file1.pdf" "printerName"

exit

Note that you can write scripts in many programming languages that accomplish the same task more elegantly.

like image 26
iND Avatar answered Nov 10 '22 01:11

iND


I successfully tested forking a delayed kill command before starting the print job.

start cmd /c "timeout 15 & taskkill /f /im acrord32.exe"
acroRD32.exe /t "file1.pdf" "printerName"
like image 41
Steven Brimer Avatar answered Nov 10 '22 00:11

Steven Brimer