2011-02-22 58 views

Respuesta

1

No puede cerrar la última ventana abierta de Acrobat a través de la línea de comando. De la historia antigua de scripts de programación para Acrobat, creo que tampoco hay forma de hacerlo en un script de Acrobat.

Pero puede cerrar Acrobat desde la línea de comandos, aunque es un poco intrincado. Para un método puro MSDOS para la mayoría de los sistemas Windows, cree dos archivos: called.bat y 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 

Tenga en cuenta que se puede escribir scripts en muchos lenguajes de programación que realizan la misma tarea de manera más elegante.

1

He probado con éxito el horneado de un comando de finalización de ejecución antes de comenzar el trabajo de impresión.

start cmd /c "timeout 15 & taskkill /f /im acrord32.exe" 
acroRD32.exe /t "file1.pdf" "printerName" 
3

¿Por qué incluso usar Acrobat en absoluto? Esta clase que se imprime en silencio para usted sin ningún tipo de ejecutables o incluso una configuración de la impresora:

Ejemplo de uso:
bool isPrinted = BatchPrint.PrintBinaryFile ("ruta de archivo", "Dirección IP de la impresora", "Nombre de cola" "Usuario");


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

} 
Cuestiones relacionadas