2

ここに画像の説明を入力してください

SWTTitleAreaDialogに印刷ボタンがあります。

viewPDFButton.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent e) {
        try {

           startPdfPrintOperation();
        }
        catch (Exception e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
        }
     }
  }); 

テーブルからのユーザー選択から既存のPDFファイル名とパスを取得しています。次に、pdfファイルをローカルプリンターに印刷したいです。ユーザーは、選択したローカルプリンターを選択できるようにする必要があります。

public void startPdfPrintOperation() throws Exception {
  File file = new File(getPDFFileName());
  RandomAccessFile raf;
  raf = new RandomAccessFile(file, "r");
  FileChannel channel = raf.getChannel();
  ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
  pdfFile = new PDFFile(buf);
  PDFPrintPage pages = new PDFPrintPage(pdfFile);

  // Create Print Job
  pjob = PrinterJob.getPrinterJob();
  pjob.setPrintable(new MyPrintable());
  final HashPrintRequestAttributeSet attset;
  attset = new HashPrintRequestAttributeSet ();
  attset.add (new PageRanges (1, pdfFile.getNumPages ()));
  if (pjob.printDialog (attset)) {
      try {
           pjob.print (attset);
      }
      catch (PrinterException e) {
           e.printStackTrace();
      }
  }             
}
class MyPrintable implements Printable {
  public int print (Graphics g, PageFormat format, int index) throws PrinterException {
     int pagenum = index+1;
        if (pagenum < 1 || pagenum > pdfFile.getNumPages ())
            return NO_SUCH_PAGE;

        Graphics2D g2d = (Graphics2D) g;
        AffineTransform at = g2d.getTransform ();
        PDFPage pdfPage = pdfFile.getPage (pagenum);

        Dimension dim;
        dim = pdfPage.getUnstretchedSize ((int) format.getImageableWidth (),
                                       (int) format.getImageableHeight (),
                                       pdfPage.getBBox ());

        Rectangle bounds = new Rectangle ((int) format.getImageableX (),
                                       (int) format.getImageableY (),
                                       dim.width,
                                       dim.height);

        PDFRenderer rend = new PDFRenderer (pdfPage, (Graphics2D) g, bounds, null, null);

        try
        {
           pdfPage.waitForFinish ();
           rend.run ();
        }
        catch (InterruptedException ie)
        {
           MessageDialog.openError(null, "PDF Error Message", "Needs");
        }
        g2d.setTransform (at);
        g2d.draw (new Rectangle2D.Double (format.getImageableX (),
                                       format.getImageableY (),
                                       format.getImageableWidth (),
                                       format.getImageableHeight ()));
     return PAGE_EXISTS;
  }
}

315行目から上記のエラーが発生しています

if (pjob.printDialog (attset)) {

プリンタダイアログが開き、アプリケーション全体がフリーズし、応答しなくなります。その後、約30秒で、上記のエラーが発生します。

私は複数の場所で使用しようとし Display.getDefault().asyncExec(new Runnable() )ましたが、それは役に立ちませんでした。

ベースダイアログがSWTで、プリンターダイアログがAWTであることが原因でしょうか?

4

1 に答える 1

1

「複数の場所で」定義しなかったので、独自のクラスで印刷ジョブをリファクタリングThreadし、メソッドで印刷ジョブの開始を拡張および実装することをお勧めしますrun
上記のコードのすべてのクラスに精通しているわけではありません。このスレッドを開始するだけで、SWTスレッドと並行して実行されます。共有リソースを避けてみてください。これはデッドロックの解決に役立つ場合があります。このスレッドからのUI応答が必要な場合は、たとえばSWTメッセージボックス(「印刷が完了しました!」)をへの呼び出しでラップできますDisplay.getDefault().asyncExec(new Runnable() { ... }
さらに、UIコードなしの印刷コードで同じ例外が発生するかどうかをテストしてください。その場合、環境が正しく構成されていない可能性があります。

于 2012-11-10T11:46:15.260 に答える