You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@pdfbox.apache.org by Jeroen Verhagen <je...@gmail.com> on 2013/07/02 13:25:51 UTC

endless loop in printing Printable

Hi all,

I'm using PDFBox 1.8.2 to print a pdf to my printer using a certain tray.
However the following code (below) produces a pdf being sent to the printer
with an endless number of pages. Can anyone tell me what's causing this or
how to avoid this?

Btw if I use the PDDocument silentPrint() method this problem does not
occur and only 1 page is printed but then I cannot supply
PrintRequestAttributes to say to which tray to print.

Thanks for any help.

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.HashPrintServiceAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.PrintServiceAttributeSet;
import javax.print.attribute.standard.*;
import java.awt.print.PrinterJob;
import java.io.IOException;


public class PDFBoxTest {

    public static void main(String[] args) throws IOException {
        PDDocument document = new PDDocument();
        try {
            // Get a named printer
            PrintServiceAttributeSet pSet = new
HashPrintServiceAttributeSet();
            pSet.add(new PrinterName("PDFCreator", null));
            PrintService[] pServices =
PrintServiceLookup.lookupPrintServices(null, pSet);
            if (pServices.length > 0) {
                // Get media tray
                MediaTray mt = getMediaTray(pServices[0], "Tray 3");
                PrintRequestAttributeSet attrs = new
HashPrintRequestAttributeSet();
                if (mt != null) {
                    attrs = new HashPrintRequestAttributeSet(mt);
                }

                attrs.add(new Copies(3));
                attrs.add(Sides.ONE_SIDED);

                // Get the printer job
                PrinterJob pJob = PrinterJob.getPrinterJob();
                pJob.setPrintService(pServices[0]);

                // Attribute set

                PDPage page = new PDPage();
                document.addPage(page);

                // Create a new font object selecting one of the PDF base
fonts
                PDFont font = PDType1Font.HELVETICA_BOLD;

                // Start a new content stream which will "hold" the to be
created content
                PDPageContentStream contentStream = new
PDPageContentStream(document, page);

                // Define a text content stream using the selected font,
moving the cursor and drawing the text "Hello World"
                contentStream.beginText();
                contentStream.setFont(font, 12);
                contentStream.moveTextPositionByAmount(100, 700);
                contentStream.drawString("Hello World");
                contentStream.endText();

                // Make sure that the content stream is closed:
                contentStream.close();

                // print
                pJob.setPrintable(document.getPrintable(0));
                pJob.print(attrs);
            }
        } catch (Throwable t) {
            t.printStackTrace();
        } finally {
            document.close();
        }

    }

    private static MediaTray getMediaTray(PrintService ps, String trayName)
{
        // Get supported media
        Media[] media = (Media[])
ps.getSupportedAttributeValues(Media.class, null, null);
        for (int count = 0; count < media.length; ++count) {
            if (media[count] instanceof MediaTray) {
                if (trayName.equals(media[count].toString())) {
                    return (MediaTray) media[count];
                }
            }
        }

        return null;
    }
}


-- 

regards,

Jeroen

Re: endless loop in printing Printable

Posted by Andreas Lehmkuehler <an...@lehmi.de>.
Hi,

Am 02.07.2013 13:25, schrieb Jeroen Verhagen:
> Hi all,
>
> I'm using PDFBox 1.8.2 to print a pdf to my printer using a certain tray.
> However the following code (below) produces a pdf being sent to the printer
> with an endless number of pages. Can anyone tell me what's causing this or
> how to avoid this?
What is on those pages? Are they repeated or do they just contain garbage?

> Btw if I use the PDDocument silentPrint() method this problem does not
> occur and only 1 page is printed but then I cannot supply
> PrintRequestAttributes to say to which tray to print.
Hmmm, silentPrint and print are the very same from the printing POV. The only
difference is the print options dialog which is presented to the user before
printing. Saying that, I can't image that you are really doing the same.

> Thanks for any help.
>
> import org.apache.pdfbox.pdmodel.PDDocument;
> import org.apache.pdfbox.pdmodel.PDPage;
> import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
> import org.apache.pdfbox.pdmodel.font.PDFont;
> import org.apache.pdfbox.pdmodel.font.PDType1Font;
>
> import javax.print.PrintService;
> import javax.print.PrintServiceLookup;
> import javax.print.attribute.HashPrintRequestAttributeSet;
> import javax.print.attribute.HashPrintServiceAttributeSet;
> import javax.print.attribute.PrintRequestAttributeSet;
> import javax.print.attribute.PrintServiceAttributeSet;
> import javax.print.attribute.standard.*;
> import java.awt.print.PrinterJob;
> import java.io.IOException;
>
>
> public class PDFBoxTest {
>
>      public static void main(String[] args) throws IOException {
>          PDDocument document = new PDDocument();
>          try {
>              // Get a named printer
>              PrintServiceAttributeSet pSet = new
> HashPrintServiceAttributeSet();
>              pSet.add(new PrinterName("PDFCreator", null));
>              PrintService[] pServices =
> PrintServiceLookup.lookupPrintServices(null, pSet);
>              if (pServices.length > 0) {
>                  // Get media tray
>                  MediaTray mt = getMediaTray(pServices[0], "Tray 3");
>                  PrintRequestAttributeSet attrs = new
> HashPrintRequestAttributeSet();
>                  if (mt != null) {
>                      attrs = new HashPrintRequestAttributeSet(mt);
>                  }
>
>                  attrs.add(new Copies(3));
>                  attrs.add(Sides.ONE_SIDED);
>
>                  // Get the printer job
>                  PrinterJob pJob = PrinterJob.getPrinterJob();
>                  pJob.setPrintService(pServices[0]);
>
>                  // Attribute set
>
>                  PDPage page = new PDPage();
>                  document.addPage(page);
>
>                  // Create a new font object selecting one of the PDF base
> fonts
>                  PDFont font = PDType1Font.HELVETICA_BOLD;
>
>                  // Start a new content stream which will "hold" the to be
> created content
>                  PDPageContentStream contentStream = new
> PDPageContentStream(document, page);
>
>                  // Define a text content stream using the selected font,
> moving the cursor and drawing the text "Hello World"
>                  contentStream.beginText();
>                  contentStream.setFont(font, 12);
>                  contentStream.moveTextPositionByAmount(100, 700);
>                  contentStream.drawString("Hello World");
>                  contentStream.endText();
>
>                  // Make sure that the content stream is closed:
>                  contentStream.close();
>
>                  // print
>                  pJob.setPrintable(document.getPrintable(0));
>                  pJob.print(attrs);
>              }
>          } catch (Throwable t) {
>              t.printStackTrace();
>          } finally {
>              document.close();
>          }
>
>      }
>
>      private static MediaTray getMediaTray(PrintService ps, String trayName)
> {
>          // Get supported media
>          Media[] media = (Media[])
> ps.getSupportedAttributeValues(Media.class, null, null);
>          for (int count = 0; count < media.length; ++count) {
>              if (media[count] instanceof MediaTray) {
>                  if (trayName.equals(media[count].toString())) {
>                      return (MediaTray) media[count];
>                  }
>              }
>          }
>
>          return null;
>      }
> }
>
>