2011-02-22 7 views

risposta

1

Non è possibile chiudere l'ultima finestra aperta di Acrobat tramite la riga di comando. Dalla storia antica degli script di programmazione per Acrobat, credo che non ci sia modo di farlo anche in uno script Acrobat.

Ma è possibile chiudere Acrobat dalla riga di comando, sebbene sia un po 'contorto. Per un metodo MSDOS puro per la maggior parte dei sistemi Windows, creare due file: called.bat e 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 

noti che è possibile scrivere script in molti linguaggi di programmazione che svolgono lo stesso compito più elegante.

1

Ho testato con successo un comando di omissione ritardata prima di avviare il lavoro di stampa.

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

Perché persino utilizzare Acrobat? Questa classe che stampa in silenzio per voi, senza alcun eseguibili o addirittura una configurazione della stampante:

campione Uso:
bool isPrinted = BatchPrint.PrintBinaryFile ("percorso del file", "Indirizzo IP della stampante", "Nome coda", "Utente");


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

}