Eu resolvi meu problema e acabei fazendo o seguinte:
-
Cada documento é impresso em arquivos * .xps, em uma pasta
Z:\Print
usando a impressora XPS (impressão de PDF não disponível na máquina de trabalho) no VBA, usando este código:Application.ActivePrinter = XPSPrinter ActivePrinterName = Application.ActivePrinter If (InStr(ActivePrinterName, "XPS")) Then Dim Filename As String Filename = ActiveWorkbook.name rngPrint.PrintOut Copies:=1, _ printtofile:=True, prtofilename:=FilePath & File & ".xps" End If
-
No script em lote de 7.00 (usando ghostscript ), a conversão de todos os arquivos * .xps para arquivos * .pdf está agendada. Provavelmente não precisamos de duas variáveis de nome de arquivo, é uma sobra de depuração.
@echo off setlocal enabledelayedexpansion FOR /R Z:\Overnight\Print %%F in (*.xps) DO ( Set filename=%%~nF%%~xF Set outputFilename=%%~nF%.pdf Set filename2=Z:\Print\%!filename! Set outputFilename2=Z:\PrintPDF\%!outputFilename! C:\ghostxps\gxps.exe -sDEVICE=pdfwrite -sOutputFile=!outputFilename2! -dNOPAUSE !filename2! ) exit exit
-
Em seguida, um programa java que eu escrevi é executado, ele mescla arquivos pdf separados em grupos desejados (usando o pdfbox )
public void combine(String outputName, String[] filenames) throws IOException, PrinterException { try { PDFMergerUtility mergePdf = new PDFMergerUtility(); for (String filename : filenames){ mergePdf.addSource(getFileByName(filename)); } mergePdf.setDestinationFileName(outputPath+outputName+".pdf"); mergePdf.mergeDocuments(); System.out.println("Combined "+outputName); } catch (Exception e) { e.printStackTrace(); } }
-
Finalmente, um lote que imprime todos os arquivos PDF combinados é executado. Matar o processo atrasado é necessário, se você tentar colocar o processo kill após a invocação do processo, ele apenas informará que o processo não foi encontrado (mesmo que esteja no gerenciador de tarefas)
@echo off setlocal enabledelayedexpansion RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "\SITE\PRINTER-BATCH" FOR /R Z:\CombinedPDF %%F in (*.pdf) DO ( Set filename=%%~nF%%~xF Set filename2=Z:\CombinedPDF\%!filename! start cmd /c "timeout 15 & taskkill /f /im acrord32.exe" call "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /t !filename2! ) RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "\SITE\PRINTER-DEFAULT" exit exit
-