2

Postscript ファイルを 1 つのジョブでプリンターに送信するには、Java メソッドを作成する必要があります。つまり、次の Unix コマンドの効果を再現する必要があります。

lp -d printer file1.ps file2.ps file3.ps

まず、PS ファイルを連結できると考えました ( ConcatInputStreamPrintJobWatcherなどのクラスを使用)。ただし、結果のマージされた 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}")
        }

    }
}

外部の実行可能ファイルを使用したくない場合でも...この問題は私にとってもはや重大ではありません。外部実行可能ファイルへの呼び出しが必要ない場合は、回答を受け入れます。

4

2 に答える 2

0

問題の 1 つは、ドキュメント構造規則 (DSC) コメントに関連している可能性があります。これらのコメントは、ファイルに含まれるドキュメントに関するメタデータを提供します。のようなツールghostscriptは、DSC コメントを完全に無視し、ポストスクリプトのみを処理するため、結果の連結ファイルを処理できるはずです。ただし、DSC 準拠のファイルで動作することを期待するツールは、最初のファイルが終了し (End コメントでマークされている)、ファイルにさらにデータがあると混乱します。

うまくいくかもしれないことの 1 つは、ファイルからすべてのコメントを削除することです。これにより、誤解を招く DSC 情報がなくなります。(DSC コメントは常に で始まる完全な行%%になるため、RE 置換を行う必要があります。s/^%[^$]*$//g)

于 2013-08-09T22:11:17.637 に答える