0

PDFファイルを印刷するクラスを作成しました。

クラスは、スタートボタンのあるアプリケーションウィンドウを開きます。

スタートボタンをクリックすると、ProgressMonitorDialogが開き、PrintFileクラスが実行されます。これにより、ユーザーはローカルプリンターを選択し、印刷ジョブを印刷メソッドに送信できます。

すべてが正しく実行されますが、印刷ジョブがプリンタに送信されることはありません。

私はそれが印刷呼び出しを通過することを知っています

try {
    System.out.println("before\n");         
    pjob.print();
    System.out.println("after\n"); 
}

しかし、printメソッドは実行されませんか?だから私はpjob.print();が何であるかわかりません。やっています。

 public class AplotPdfPrintLocal extends ApplicationWindow {

   private String userSelectedFile;

   /////////////////////////////////////////////////////////////////////////
   //                         Constructor                                 //
   /////////////////////////////////////////////////////////////////////////
   public AplotPdfPrintLocal(String pdfFilePath) {
      super(null);
      this.userSelectedFile = "c:/Teamcenter/Tc8.3/portal/temp/james.pdf";
   }

   /////////////////////////////////////////////////////////////////////////
   //                             run()                                   //
   /////////////////////////////////////////////////////////////////////////
   public void run() {
      setBlockOnOpen(true); // Don't return from open() until window closes
      open();  // Opens the main window
      Display.getCurrent().dispose();  // Dispose the display
   }

/////////////////////////////////////////////////////////////////////////
//                         configureShell()                            //
/////////////////////////////////////////////////////////////////////////
protected void configureShell(Shell shell) {
   super.configureShell(shell);
   shell.setText("Print PDF");
}

/////////////////////////////////////////////////////////////////////////
//                         createContents()                            //
/////////////////////////////////////////////////////////////////////////
protected Control createContents(Composite parent) {
  Composite composite = new Composite(parent, SWT.NONE);
  composite.setLayout(new GridLayout(1, true));

  //final Button indeterminate = new Button(composite, SWT.CHECK);
  //indeterminate.setText("Indeterminate");

  // Create the ShowProgress button
  Button showProgress = new Button(composite, SWT.NONE);
  showProgress.setText("Select Printer");

  final Shell shell = parent.getShell();

  // Display the ProgressMonitorDialog
  showProgress.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
        try {
           new ProgressMonitorDialog(shell).run(true, true, new PrintFile(userSelectedFile, true));
        } 
        catch (InvocationTargetException e) {
           MessageDialog.openError(shell, "Error", e.getMessage());
        } 
        catch (InterruptedException e) {
           MessageDialog.openInformation(shell, "Cancelled", e.getMessage());
        }
     }
   });
   parent.pack();
   return composite;
}

//===============================================================
//    PrintFile Class
// =============================================================== 
class PrintFile extends Thread implements Printable, IRunnableWithProgress  {

  private String filename;
  private Boolean setupPaper;
  private File file; 
  private PrinterJob pjob;
  private FileInputStream fis;
  private FileChannel fc;
  private ByteBuffer bb;
  private PDFFile pdfFile;
  private PDFPrintPage pages;
  private PageFormat pfDefault;
  private Label pagenumlabel;

  public PrintFile(String filename, boolean setupPaper) {
     this.filename = filename;
     this.setupPaper = setupPaper;
  }

  /////////////////////////////////////////////////////////////////////////
  //                              run()                                  //
  /////////////////////////////////////////////////////////////////////////
  @Override
  public void run(IProgressMonitor arg0) throws InvocationTargetException, InterruptedException {
     try {
        System.out.println("File: " + filename + "\n");
        file = new File(filename);
        fis = new FileInputStream(file);
        fc = fis.getChannel();
        bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
        pdfFile = new PDFFile(bb); 
        pages = new PDFPrintPage(pdfFile);

        pjob = PrinterJob.getPrinterJob();
        pfDefault = PrinterJob.getPrinterJob().defaultPage();
        Paper defaultPaper = new Paper();
        defaultPaper.setImageableArea(0, 0, defaultPaper.getWidth(), defaultPaper.getHeight());
        pfDefault.setPaper(defaultPaper);
        if (setupPaper) {
           pfDefault = PrinterJob.getPrinterJob().pageDialog(pfDefault);
        }
        pjob.setJobName(file.getName());
        //System.out.println("File Name : " + file.getName() + "\n");
        if (pjob.printDialog()) {
           pfDefault = pjob.validatePage(pfDefault);
           Book book = new Book();
           book.append(pages, pfDefault, pdfFile.getNumPages());
           pjob.setPageable(book);
           try {
              pjob.print();
           }
           catch (PrinterException e) {
              e.printStackTrace();
           }
        }
     }
     catch (FileNotFoundException e) {
        e.printStackTrace();
     }
     catch (IOException e) {
        e.printStackTrace();
     }
  }

  /////////////////////////////////////////////////////////////////////////
  //                             print()                                 //
  /////////////////////////////////////////////////////////////////////////
  @Override
  public int print(Graphics g, PageFormat format, int index) throws PrinterException {
     System.out.println("Got in the Print\n");       
     int pagenum = index + 1;
     if ((pagenum >= 1) && (pagenum <= pdfFile.getNumPages())) {
        if (pagenumlabel != null) {
           pagenumlabel.setText(String.valueOf(pagenum));
        }
        Graphics2D g2 = (Graphics2D) g;
        PDFPage page = pdfFile.getPage(pagenum);
        double pwidth = format.getImageableWidth();
        double pheight = format.getImageableHeight();
        double aspect = page.getAspectRatio();
        double paperaspect = pwidth / pheight;
        if (paperaspect < 1.0) {
           switch (format.getOrientation()) {
              case PageFormat.REVERSE_LANDSCAPE:
              case PageFormat.LANDSCAPE:
                   format.setOrientation(PageFormat.PORTRAIT);
                   break;
              case PageFormat.PORTRAIT:
                   format.setOrientation(PageFormat.LANDSCAPE);
                   break;
           }
           pwidth = format.getImageableWidth();
           pheight = format.getImageableHeight();
           paperaspect = pwidth / pheight;
        }
        Rectangle imgbounds;
        int width;
        int height;
        if (aspect > paperaspect) {
           height = (int) (pwidth / aspect);
           width = (int) pwidth;
        } 
        else {
           width = (int) (pheight * aspect);
           height = (int) pheight;
        }
        imgbounds = new Rectangle((int) format.getImageableX(),
               (int) format.getImageableY(),
               width, height);

        PDFRenderer pgs = new PDFRenderer(page, g2, imgbounds, null, null);
        try {
           page.waitForFinish();
           pgs.run();
        } 
        catch (InterruptedException ie) {
        }
          return PAGE_EXISTS;
     } 
     else {
        return NO_SUCH_PAGE;
     }
   }
 }
}

シンプルなものが欠けているような気がしますが、それが何なのかわかりませんか?
私は本当にこの問題に固執していて、これを理解するために本当に助けが必要です。

私を助けることができるすべてに感謝します

次のコードをコメントアウトすると編集

if (pjob.printDialog()) {

プリントが出てきます!

ただし、コメントアウトされていない場合は、プリンタ選択ダイアログが開き、[OK]ボタンをクリックすると、プリンタダイアログが閉じて、何も起こりません。

編集

いくつかのテストの後、問題がpjob.printDialog()にあることを発見しました。

ifステートメントを削除して、このように設定しました。

 boolean ok = pjob.printDialog();
    System.out.println("OK value " + ok + "\n");
    //if (ok) {
       pfDefault = pjob.validatePage(pfDefault);
       Book book = new Book();
       book.append(pages, pfDefault, pdfFile.getNumPages());
       System.out.println("Print Job After : " + pjob + "\n");
       pjob.setPageable(book);
       try {
          pjob.print();
       }
       catch (PrinterException e) {
          e.printStackTrace();
       }

printDialogが開き、[OK]をクリックします-印刷ジョブがプリンターに送信されますが、何も印刷されません。[キャンセル]をクリックします-印刷ジョブは希望どおりに印刷されます

4

1 に答える 1

0

理由は100%ではありませんが、ネイティブのprintDialogの代わりにクロスプラットフォームのprintDialogを使用すると、コードは期待どおりに機能します。

これは作業コードです

           PrinterJob pjob = PrinterJob.getPrinterJob();
           PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
           PageFormat pfDefault = pjob.pageDialog(aset);
           pjob.setJobName(file.getName());
           pages.show(pjob);
           if (pjob.printDialog(aset)) {
              pfDefault = pjob.validatePage(pfDefault);
              Book book = new Book();
              book.append(pages, pfDefault, pdfFile.getNumPages());
              pjob.setPageable(book);
              try {

                 pjob.print(aset);

              }
              catch (PrinterException exc) {
                 System.out.println(exc);
              }
于 2012-11-29T14:36:55.290 に答える