从命令行关闭acrobat reader的实例 [英] closing an instance of acrobat reader from command line

查看:195
本文介绍了从命令行关闭acrobat reader的实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用以下cmd打印pdf:

  acroRD32.exe / tfile1.pdfprinterName 

一切正常,但一个窗口弹出。
任何人都可以帮我禁用它。
我尝试了此问题
中包含的各种选项,但

解决方案

为什么甚至使用Acrobat?此类无需任何可执行文件或打印机设置即可静默打印:



示例用法

bool isPrinted = BatchPrint.PrintBinaryFile(文件路径,打印机IP地址,队列名称,用户);






  public class BatchPrint 
{

private const int cPort = 515;
private const char cLineFeed ='\\\
';
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队列mPrintQueue = new Queue();
private static readonly字典< 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} \\\
P {1} \\\
{5} {2} \\\
U {3} \\\
N {4} \\\
,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,没有响应打印机))
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,控制文件错误))
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 +文件长度错误;
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(acknowledge [0] == 0)
return true;
ErrorMessage = errorMsg;
networkStream.Close();
tcpClient.Close();
return false;
}

}


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.

解决方案

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;
    }

}

这篇关于从命令行关闭acrobat reader的实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆