package gnu.jpdf;
import java.awt.HeadlessException;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Pageable;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Locale;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.IntegerSyntax;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.TextSyntax;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.RequestingUserName;
import javax.swing.JFileChooser;
/**
* <p>
* This class extends awt's PrinterJob, to provide a simple method of writing
* PDF documents.
* </p>
*
* <p>
* You can use this with any code that uses Java's printing mechanism. It does
* include a few extra methods to provide access to some of PDF's features like
* annotations, or outlines.
* </p>
*
* @author Gilbert DeLeeuw, gil1@users.sourceforge.net
*/
public class PDFPrinterJob extends PrinterJob {
/**
* The file chooser
*/
private static JFileChooser fileChooser;
/**
* Printing options;
*/
private PrintRequestAttributeSet attributes;
/**
* PDF document properties
*/
private PDFInfo info;
/**
* A pageable, or null
*/
private Pageable pageable = null;
/**
* Page format.
*/
private PageFormat pageFormat;
/**
* The Printable object to print.
*/
private Printable printable;
/**
* The actual print job.
*/
private PDFJob printJob;
/**
* Initializes a new instance of <code>PDFPrinterJob</code>.
*/
public PDFPrinterJob() {
attributes = new HashPrintRequestAttributeSet();
info = new PDFInfo();
pageFormat = new PageFormat(); // default page format.
setJobName("Java Printing");
}
@Override
public void cancel() {
// Cancel is not an option
}
@Override
public PageFormat defaultPage(PageFormat page) {
return validatePage(page);
}
@Override
public int getCopies() {
return ((IntegerSyntax) attributes.get(Copies.class)).getValue();
}
@Override
public String getJobName() {
return ((TextSyntax) attributes.get(JobName.class)).getValue();
}
public static PrinterJob getPrinterJob() {
return new PDFPrinterJob();
}
@Override
public String getUserName() {
return ((TextSyntax) attributes.get(RequestingUserName.class))
.getValue();
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public PageFormat pageDialog(PageFormat page) throws HeadlessException {
// No page dialog is supported.
return (PageFormat) page.clone();
}
/**
* Prints a set of pages.
*
* @param pathname
* the full path for the output PDF file.
* @exception PrinterException
* an error in the print system caused the job to be aborted.
* @see Book
* @see Pageable
* @see Printable
*/
public void print(String pathname) throws PrinterException {
int pageCount;
File file = null;
FileOutputStream fileOutputStream = null;
try {
file = new File(pathname);
fileOutputStream = new FileOutputStream(file);
} catch (Exception e) {
System.err.println("Error!! - Invalid output file path: "
+ pathname);
}
PDFGraphics pdfGraphics = null;
printJob = new PDFJob(fileOutputStream);
if (info != null) {
printJob.getPDFDocument().setPDFInfo(info);
}
pageCount = pageable.getNumberOfPages();
for (int pageIndex = 0; pageIndex < pageCount; pageIndex++) {
pageFormat = pageable.getPageFormat(pageIndex);
pdfGraphics = (PDFGraphics) printJob.getGraphics(pageFormat);
printable = pageable.getPrintable(pageIndex);
printable.print(pdfGraphics, pageFormat, pageIndex);
pdfGraphics.dispose();
}
printJob.end();
}
@Override
public void print() throws PrinterException {
File file;
File path;
String jobName = getJobName();
if (fileChooser == null) {
fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(false);
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
}
// Make sure job name is not blank
if (jobName.equals("")) {
jobName = "Java Printing";
}
// Eliminate invalid characters from job name.
jobName = jobName.replaceAll("\\\\", "-");
jobName = jobName.replaceAll("/", "-");
path = fileChooser.getCurrentDirectory();
file = new File(path, jobName + ".pdf");
// Dialog to get file name...
fileChooser.setSelectedFile(file);
// Print
if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile();
print(file.getAbsolutePath());
}
}
@Override
public boolean printDialog() throws HeadlessException {
return true;
}
/**
* Sets the author for this document.
*
* @param author the author's name.
*/
public void setAuthor(String author) {
info.setAuthor(author);
}
@Override
public void setCopies(int copies) {
// Will be ignored, but add attribute anyway
attributes.add(new Copies(copies));
}
/**
* Sets the creator for this document.
*
* @param creator the application name.
*/
public void setCreator(String creator) {
info.setCreator(creator);
}
@Override
public void setJobName(String jobName) {
attributes.add(new JobName(jobName, Locale.getDefault()));
if (info.getTitle() == null) {
info.setTitle(jobName);
}
}
@Override
public void setPageable(Pageable document) throws NullPointerException {
if (document == null) {
throw new NullPointerException("Pageable cannot be null.");
}
this.pageable = document;
}
@Override
public void setPrintable(Printable painter) {
this.printable = painter;
}
@Override
public void setPrintable(Printable painter, PageFormat format) {
this.printable = painter;
this.pageFormat = format;
}
/**
* Sets the title for this document.
*
* @param title the document title.
*/
public void setTitle(String title) {
info.setTitle(title);
}
@Override
public PageFormat validatePage(PageFormat page) {
return (PageFormat) page.clone();
}
}