Package gnu.jpdf

Source Code of gnu.jpdf.PDFPrinterJob

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();
  }

}
TOP

Related Classes of gnu.jpdf.PDFPrinterJob

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.