6

PDF ドキュメントを複数部印刷しようとしています。少しグーグルで調べた後、PrintRequestAttributeSetにコピーを配置する必要があることがわかりました。しかし、これを行った後、私が提供した量ではなく、1 部しか印刷されません。

デバッグ中に、印刷オブジェクトがそのコピー変数を 0 から 2 に変更することがわかるので、すべてを正しく行ったと仮定します。また、collat​​ion 変数と multipledocumenthandling 変数を少しいじってみましたが、最終結果は変わりません。

正しい部数を印刷する方法を知っている人はいますか?

私のコード:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MultipleDocumentHandling;
import javax.print.attribute.standard.SheetCollate;

public class PrintTest {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        InputStream is = new BufferedInputStream(
                new FileInputStream(
                        "<Insert pdf file here>"));

        DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

        Copies copies = new Copies(2);

        SheetCollate collate = SheetCollate.COLLATED;

        MultipleDocumentHandling handling = MultipleDocumentHandling.SEPARATE_DOCUMENTS_COLLATED_COPIES;

        PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

        pras.add(copies);
        pras.add(collate);
        pras.add(handling);

        PrintService service = PrintServiceLookup.lookupDefaultPrintService();

        DocPrintJob printJob = service.createPrintJob();

        Doc doc = new SimpleDoc(is, flavor, null);

        printJob.print(doc, pras);
    }
}

だから私はもう少し遊んでいます。指定どおりに正確に印刷できない場合に印刷ジョブを強制的に拒否するために使用できる Fidelity と呼ばれるものがあることがわかりました。しかし、これにはいくつかの問題があります。忠実度設定を追加すると、次の出力が得られます。

[class javax.print.attribute.standard.JobName, class javax.print.attribute.standard.RequestingUserName, class javax.print.attribute.standard.Copies, class javax.print.attribute.standard.Destination, class javax.print.attribute.standard.OrientationRequested, class javax.print.attribute.standard.PageRanges, class javax.print.attribute.standard.Media, class javax.print.attribute.standard.MediaPrintableArea, class javax.print.attribute.standard.Fidelity, class javax.print.attribute.standard.SheetCollate, class sun.print.SunAlternateMedia, class javax.print.attribute.standard.Chromaticity, class javax.print.attribute.standard.Sides, class javax.print.attribute.standard.PrinterResolution]
[]
Exception in thread "main" sun.print.PrintJobAttributeException: unsupported attribute: collated
    at sun.print.Win32PrintJob.getAttributeValues(Win32PrintJob.java:667)
    at sun.print.Win32PrintJob.print(Win32PrintJob.java:332)
    at net.pearlchain.print.distribute.jasper.PrintTest.main(PrintTest.java:52)

サポートされていない属性は実行ごとに異なりますが、常に設定した属性の 1 つです。Java 6 と Java 7 を使用して実行しようとしましたが、唯一の違いは、例外がスローされる行です。Java 6 では 667 行目、Java 7 では 685 行目です。grepcode で見つかったコード見ると、例外がスローされていることがわかりますが、実際の理由は不明です。


わかりました。これが発生する理由がわかりました。選択したフレーバーは複数のコピーをサポートしていません。PDFソースからの印刷をサポートするプリンターがインストールされていないため、pdfに設定すると、flavornotsupported例外が発生します。


久しぶりで、将来の訪問者のためにここに私のソリューションを投稿するのを忘れていました.

サードパーティの pdf ライブラリ (Apache PDFBox) を追加することで、これを解決しました。これにより、必要なすべての設定でプリンターに送信できる入力ストリームが提供されました。

http://pdfbox.apache.org/

コードにアクセスできなくなりましたが、これは将来の訪問者にとって役立つ可能性があります。:)

4

0 に答える 0