Postscript ファイルを 1 つのジョブでプリンターに送信するには、Java メソッドを作成する必要があります。つまり、次の Unix コマンドの効果を再現する必要があります。
lp -d printer file1.ps file2.ps file3.ps
まず、PS ファイルを連結できると考えました ( ConcatInputStreamやPrintJobWatcherなどのクラスを使用)。ただし、結果のマージされた PS ファイルが常に有効であるとは限りません。
それが役立つ場合、これが私の現在のコードです(Groovyで実行するように依頼されています):
/**
* Prints the {@code files} {@code copyCount} times using
* {@code printService}.
* <p>
* Exceptions may be thrown.
* @param printService Print service
* @param files Groovy array of {@code File} objects
* @param copyCount Number of copies to print
*/
private static void printJob(
PrintService printService,
def files,
int copyCount) {
// No multiple copy support for PS file, must do it manually
copyCount.times { i ->
InputStream inputStream = null
try {
log.debug("Create stream for copy #${i}")
inputStream = new ConcatInputStream()
for (def file in files) {
if (file != null) {
log.debug("Add '${file.absolutePath}' to the stream")
((ConcatInputStream)inputStream).addInputStream(
new FileInputStream(file))
}
}
log.debug("Create document")
Doc doc = new SimpleDoc(
inputStream, DocFlavor.INPUT_STREAM.AUTOSENSE, null)
log.debug("Create print job")
DocPrintJob docPrintJob = printService.createPrintJob()
log.debug("Create watcher")
PrintJobWatcher watcher = new PrintJobWatcher(docPrintJob)
log.debug("Print copy #${i}")
docPrintJob.print(doc, null)
log.debug("Wait for completion")
watcher.waitForDone()
} finally {
if (inputStream) log.debug("Close the stream")
inputStream?.close()
}
}
}
PS を PDF に変換することは許可されていません。
ここで、PS ファイルの間に挿入できることを読みました。false 0 startjob pop
しかし、それでは、仕事は1つしかありませんか?
「仕事」の概念を混同しているかもしれません...
トピックに関する投稿が見つかりませんでした (複数の PS ファイルを 1 つのジョブでプリンターに送信する)。解決策は非常に明白であるため、私がこの質問を投稿した理由はわかりません。
私の次の試みはlp
、クラスから実行することです。汚れているように見えても、そのように動作させることができることはわかっています...もっと簡単な方法を知っている場合は教えてください。
編集:
(以下のように)実行lp
するとうまくいきます:
/**
* Prints the {@code files} {@code copyCount} times using an executable.
* <p>
* Exceptions may be thrown.
* @param config ConfigObject containing closures for building the
* command line to the printing executable, and to analyze the
* return code. Example of config file:
*
* print {
* commandClosure = { printerName, files ->
* [
* 'lp',
* '-d', printerName,
* files.collect{ it.absolutePath }
* ].flatten()
* }
* errorClosure = { returnCode, stdout, stderr -> returnCode != 0 }
* warnClosure = { returnCode, stdout, stderr ->
* !stderr?.isAllWhitespace() }
* }
*
* @param printerName Printer name
* @param files Groovy array of {@code File} objects
* @param copyCount Number of copies to print
*/
private static void printJob(
ConfigObject config,
String printerName,
def files,
int copyCount) {
files.removeAll([null])
Integer copyCount = job.copyCountString.toInteger()
copyCount.times { i ->
def command = config.print.commandClosure(printerName, files)
log.debug("Command: `" + command.join(' ') + "`")
def proc = command.execute()
proc.waitFor()
def returnCode = proc.exitValue()
def stdout = proc.in.text
def stderr = proc.err.text
def debugString = "`" + command.join(' ') +
"`\nReturn code: " + returnCode +
"\nSTDOUT:\n" + stdout + "\nSTDERR:\n" + stderr
if (config.print.errorClosure(returnCode, stdout, stderr)) {
log.error("Error while calling ${debugString}")
throw new PrintException("Error while calling ${debugString}")
} else if (config.print.warnClosure(returnCode, stdout, stderr)) {
log.warn("Warnings while calling ${debugString}")
} else {
log.debug("Command successful ${debugString}")
}
}
}
外部の実行可能ファイルを使用したくない場合でも...この問題は私にとってもはや重大ではありません。外部実行可能ファイルへの呼び出しが必要ない場合は、回答を受け入れます。