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]をクリックします-印刷ジョブがプリンターに送信されますが、何も印刷されません。[キャンセル]をクリックします-印刷ジョブは希望どおりに印刷されます