Example usage for com.lowagie.text.pdf PdfWriter getDirectContent

List of usage examples for com.lowagie.text.pdf PdfWriter getDirectContent

Introduction

In this page you can find the example usage for com.lowagie.text.pdf PdfWriter getDirectContent.

Prototype


public PdfContentByte getDirectContent() 

Source Link

Document

Use this method to get the direct content for this document.

Usage

From source file:org.sonarqube.report.extendedpdf.OverviewPDFReporter.java

License:Open Source License

protected void printFrontPage(Document frontPageDocument, PdfWriter frontPageWriter)
        throws org.dom4j.DocumentException, ReportException {
    String frontPageTemplate = "/templates/frontpage.pdf";
    try {//from w ww.j a  v  a2 s. c  om
        PdfContentByte cb = frontPageWriter.getDirectContent();
        PdfReader reader = new PdfReader(this.getClass().getResourceAsStream(frontPageTemplate));
        PdfImportedPage page = frontPageWriter.getImportedPage(reader, 1);
        frontPageDocument.newPage();
        cb.addTemplate(page, 0, 0);

        Project project = getProject();

        Rectangle pageSize = frontPageDocument.getPageSize();
        PdfPTable projectInfo = new PdfPTable(1);
        projectInfo.getDefaultCell().setVerticalAlignment(PdfCell.ALIGN_MIDDLE);
        projectInfo.getDefaultCell().setHorizontalAlignment(PdfCell.ALIGN_LEFT);
        projectInfo.getDefaultCell().setBorder(Rectangle.BOTTOM);
        projectInfo.getDefaultCell().setPaddingBottom(10);
        projectInfo.getDefaultCell().setBorderColor(Color.GRAY);
        Font font = FontFactory.getFont(FontFactory.COURIER, 18, Font.NORMAL, Color.LIGHT_GRAY);

        Phrase projectName = new Phrase("Project: " + project.getName(), font);
        projectInfo.addCell(projectName);

        Phrase projectVersion = new Phrase("Version: " + project.getMeasures().getVersion(), font);
        projectInfo.addCell(projectVersion);

        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm");
        Phrase projectAnalysisDate = new Phrase("Analysis Date: " + df.format(project.getMeasures().getDate()),
                font);
        projectInfo.addCell(projectAnalysisDate);

        projectInfo.setTotalWidth(
                pageSize.getWidth() - frontPageDocument.leftMargin() * 2 - frontPageDocument.rightMargin() * 2);
        projectInfo.writeSelectedRows(0, -1, frontPageDocument.leftMargin(), pageSize.getHeight() - 575,
                frontPageWriter.getDirectContent());
        projectInfo.setSpacingAfter(10);
    } catch (IOException e) {
        Logger.error("Cannot find the required template: " + frontPageTemplate);
        e.printStackTrace();
    }
}

From source file:org.tellervo.desktop.graph.GraphPrintDialog.java

License:Open Source License

protected boolean printPDF(final GraphSettings pinfo, final GrapherPanel plotter) {
    final JFileChooser chooser = new JFileChooser();
    final Container me = getParent();
    chooser.setFileFilter(new FileFilter() {
        @Override/* w  w w  .  j a v a 2s  . c  om*/
        public boolean accept(File f) {
            return f.getName().endsWith(".pdf");
        }

        @Override
        public String getDescription() {
            return "PDF Document files (*.pdf)";
        }
    });
    chooser.setMultiSelectionEnabled(false);
    chooser.setAcceptAllFileFilterUsed(false);
    //chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    int returnVal = chooser.showSaveDialog(this);
    if (returnVal != JFileChooser.APPROVE_OPTION)
        return false;

    EventQueue.invokeLater(new Runnable() {
        public void run() {

            ProgressMonitor pm = new ProgressMonitor(me, // parent
                    "Exporting graph to PDF file...", // message
                    "", // note
                    0, 5); // round up to 45 MB

            pm.setMillisToDecideToPopup(0);
            pm.setMillisToPopup(0);

            pm.setProgress(1);
            pm.setNote("Creating PDF document...");

            String fn = chooser.getSelectedFile().getAbsolutePath();
            if (!fn.toLowerCase().endsWith(".pdf"))
                fn += ".pdf";

            // create a PDF document

            Rectangle rect = new Rectangle(0, 0, (pinfo.getDrawBounds().getSpan() * pinfo.getYearWidth()),
                    (pinfo.getPrintHeight()));
            com.lowagie.text.Rectangle pageSize = new com.lowagie.text.Rectangle(rect.width, rect.height);
            Document document = new Document(pageSize);

            try {
                // create an associated writer
                PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(new File(fn)));

                // "open" the PDF
                document.open();

                // set up a font mapper
                //DefaultFontMapper mapper = new DefaultFontMapper();               
                //FontFactory.registerDirectories();

                pm.setProgress(2);
                pm.setNote("Creating PDF memory context...");

                // do some magic to set up the pdf context
                PdfContentByte cb = writer.getDirectContent();
                Graphics2D g = cb.createGraphicsShapes(pageSize.getWidth(), pageSize.getHeight());

                plotter.computeRange(pinfo, g);
                plotter.paintGraph(g, pinfo);

                // finish up the PDF cruft
                //cb.addTemplate(tp, 0, 0);                        

                //dispose of the graphics content
                pm.setProgress(4);
                pm.setNote("Cleaning up...");
                g.dispose();
            } catch (DocumentException de) {
                log.error(de.getMessage());
                de.printStackTrace();
            } catch (IOException ioe) {
                log.error(ioe.getMessage());
                ioe.printStackTrace();
            }

            document.close();
            pm.setProgress(5);
        }
    });
    return true;
}

From source file:org.tellervo.desktop.print.BasicBoxLabel.java

License:Open Source License

public void generateBoxLabel(OutputStream output) {

    try {/*from  w  w w  .j av  a2 s.  c  o m*/

        PdfWriter writer = PdfWriter.getInstance(document, output);

        document.setPageSize(PageSize.LETTER);

        document.open();

        cb = writer.getDirectContent();

        // Set basic metadata
        document.addAuthor("Tellervo");
        document.addSubject("Tellervo Box Labels");

        PdfPTable table = new PdfPTable(2);
        table.setTotalWidth(495f);
        table.setLockedWidth(true);

        for (WSIBox b : boxlist) {
            Paragraph p = new Paragraph();

            p.add(new Chunk(b.getTitle() + Chunk.NEWLINE, labelTitleFont));
            p.add(new Chunk(Chunk.NEWLINE + b.getComments() + Chunk.NEWLINE, bodyFont));
            p.add(new Chunk(App.getLabName() + Chunk.NEWLINE + Chunk.NEWLINE, bodyFont));
            p.add(new Chunk(this.getBarCode(b), 0, 0, true));

            PdfPCell cell = new PdfPCell(p);
            cell.setPaddingLeft(15f);
            cell.setPaddingRight(15f);
            cell.setBorderColor(Color.LIGHT_GRAY);

            table.addCell(cell);

        }

        PdfPCell cell = new PdfPCell(new Paragraph());
        cell.setBorderColor(Color.LIGHT_GRAY);

        table.addCell(cell);
        document.add(table);
        document.close();

        /*float top = document.top(15);
        int row = 1;
                
        for(int i = 0; i< boxlist.size(); i = i+2)
        {
                   
           log.debug("Document left : "+document.left());
           log.debug("Document right: "+document.right());
           log.debug("Top           : "+top);
                   
                   
                   
                   
                   
                   
          // Column 1      
          ColumnText ct1a = new ColumnText(cb);
          ct1a.setSimpleColumn(document.left(), 
                   top-210, 
                   368, 
                   top, 
                   20, 
                   Element.ALIGN_LEFT);
                  
          ColumnText ct1b = new ColumnText(cb);
          ct1b.setSimpleColumn(document.left(), 
             top-70, 
             document.left()+206, 
             top-150, 
             20, 
             Element.ALIGN_LEFT);
                  
          try{
        WSIBox b1 = boxlist.get(i);
        ct1a.addText(getTitlePDF(b1));
        ct1a.go();
                     
                
        ct1b.addElement(getBarCode(b1));
        ct1b.go();
                
          } catch (Exception e)
          {
             log.debug("Failed writing box label in left column where i="+i);
          }
                  
                  
          // Column 2      
          ColumnText ct2a = new ColumnText(cb);
          ct2a.setSimpleColumn(306, 
                   top-210, 
                   document.right(), 
                   top, 
                   20, 
                   Element.ALIGN_LEFT);
                  
          ColumnText ct2b = new ColumnText(cb);
          ct2b.setSimpleColumn(306, 
             top-70, 
             512,  
             top-80, 
             20, 
             Element.ALIGN_LEFT);
                  
          try{
        WSIBox b2 = boxlist.get(i+1);
        ct2a.addText(getTitlePDF(b2));
        ct2a.go();
                     
                
        ct2b.addElement(getBarCode(b2));
        ct2b.go();
                
          } catch (Exception e)
          {
             log.debug("Failed writing box label in right column where i="+i);
             //e.printStackTrace();
          }
                  
                  
          // Column 2
        /*   ColumnText ct2 = new ColumnText(cb);
          ct2.setSimpleColumn(370,     //llx 
          top-100,            //lly   
          document.right(0),   //urx
          top+15,            //ury
          20,               //leading
          Element.ALIGN_RIGHT  //alignment
          );
                  
          try{
          WSIBox b2 = boxlist.get(i+1);
          ct2.addText(getTitlePDF(b2));
          ct2.addElement(getBarCode(b2));
          ct2.go();
          } catch (Exception e)
          {
             log.debug("Failed writing box label where i="+i+1);
          }
          */
        /*
                
        top = top-160;
                
        if(row==5)
        {
           top = document.top(15);
        document.newPage();
        row=1;
        }
        else
        {
           row++;
        }
                
                
                
                
                
        }*/

    } catch (DocumentException de) {
        System.err.println(de.getMessage());
    }

    // Close the document
    document.close();
}

From source file:org.tellervo.desktop.print.CompleteBoxLabel.java

License:Open Source License

public void generateBoxLabel(OutputStream output) {

    try {/*from w  ww. ja  v  a 2s  .  c o  m*/

        PdfWriter writer = PdfWriter.getInstance(document, output);

        document.setPageSize(PageSize.LETTER);
        document.open();

        cb = writer.getDirectContent();

        // Set basic metadata
        document.addAuthor("Peter Brewer");
        document.addSubject("Box Label");

        for (WSIBox b : this.boxlist) {

            // Title Left      
            ColumnText ct = new ColumnText(cb);
            ct.setSimpleColumn(document.left(), document.top(15) - 210, 368, document.top(15), 20,
                    Element.ALIGN_LEFT);
            ct.addText(getTitlePDF(b));
            ct.go();

            // Barcode
            ColumnText ct2 = new ColumnText(cb);
            ct2.setSimpleColumn(370, document.top(15) - 100, document.right(0), document.top(0), 20,
                    Element.ALIGN_RIGHT);
            ct2.addElement(getBarCode(b));
            ct2.go();

            // Timestamp
            ColumnText ct3 = new ColumnText(cb);
            ct3.setSimpleColumn(document.left(), document.top(15) - 223, 350, document.top(15) - 60, 20,
                    Element.ALIGN_LEFT);
            ct3.setLeading(0, 1.2f);
            ct3.addText(getTimestampPDF(b));
            ct3.go();

            // Pad text
            document.add(new Paragraph(" "));
            Paragraph p2 = new Paragraph();
            p2.setSpacingBefore(70);
            p2.setSpacingAfter(10);
            p2.add(new Chunk(" ", bodyFontLarge));
            document.add(new Paragraph(p2));

            // Ring samples table
            addTable(b);
            document.add(getParagraphSpace());

            document.add(getComments(b));

            document.newPage();

        }

    } catch (DocumentException de) {
        System.err.println(de.getMessage());
    }

    // Close the document
    document.close();
}

From source file:org.tellervo.desktop.print.ProSheet.java

License:Open Source License

private void generateProSheet(OutputStream output) {

    Paragraph spacingPara = new Paragraph();
    spacingPara.setSpacingBefore(10);//from w w w .j av a  2s  . c om
    spacingPara.add(new Chunk(" ", bodyFont));

    try {

        PdfWriter writer = PdfWriter.getInstance(document, output);
        document.setPageSize(PageSize.LETTER);

        // Set basic metadata
        document.addAuthor("Peter Brewer");
        document.addSubject("Corina Provenience Sheet for " + o.getTitle());

        HeaderFooter footer = new HeaderFooter(new Phrase(""), new Phrase(""));
        footer.setAlignment(Element.ALIGN_RIGHT);
        footer.setBorder(0);
        document.setFooter(footer);

        HeaderFooter header = new HeaderFooter(new Phrase(o.getLabCode() + " - " + o.getTitle(), bodyFont),
                false);
        header.setAlignment(Element.ALIGN_RIGHT);
        header.setBorder(0);
        document.setHeader(header);

        document.open();
        cb = writer.getDirectContent();

        // Title Left      
        ColumnText ct = new ColumnText(cb);
        ct.setSimpleColumn(document.left(), document.top() - 193, document.right(), document.top() - 20, 20,
                Element.ALIGN_LEFT);
        ct.addText(getTitlePDF());
        ct.go();

        // Timestamp
        ColumnText ct3 = new ColumnText(cb);
        ct3.setSimpleColumn(document.left(), document.top() - 223, 283, document.top() - 60, 20,
                Element.ALIGN_LEFT);
        ct3.setLeading(0, 1.2f);
        ct3.addText(getTimestampPDF());
        ct3.go();

        // Pad text
        document.add(spacingPara);
        document.add(getObjectDescription());
        document.add(getObjectComments());

        document.add(spacingPara);

        getElementTable();

    } catch (DocumentException de) {
        System.err.println(de.getMessage());
    }

    // Close the document
    document.close();
}

From source file:org.tellervo.desktop.print.SeriesReport.java

License:Open Source License

private void generateSeriesReport(OutputStream output) {

    displayUnits = NormalTridasUnit//www . ja v  a 2  s .  c  om
            .valueOf(App.prefs.getPref(PrefKey.DISPLAY_UNITS, NormalTridasUnit.MICROMETRES.name().toString()));

    try {

        PdfWriter writer = PdfWriter.getInstance(document, output);
        document.setPageSize(PageSize.LETTER);
        document.open();
        cb = writer.getDirectContent();

        // Set basic metadata
        document.addAuthor("Peter Brewer");
        document.addSubject("Tellervo Series Report for " + s.getDisplayTitle());

        // Title Left      
        ColumnText ct = new ColumnText(cb);
        ct.setSimpleColumn(document.left(), document.top() - 163, 283, document.top(), 20, Element.ALIGN_LEFT);
        ct.addText(getTitlePDF());
        ct.go();

        // Barcode
        ColumnText ct2 = new ColumnText(cb);
        ct2.setSimpleColumn(370, document.top(15) - 100, document.right(0), document.top(0), 20,
                Element.ALIGN_RIGHT);
        ct2.addElement(getBarCode());
        ct2.go();

        // Timestamp
        ColumnText ct3 = new ColumnText(cb);
        ct3.setSimpleColumn(document.left(), document.top() - 223, 283, document.top() - 60, 20,
                Element.ALIGN_LEFT);
        ct3.setLeading(0, 1.2f);
        ct3.addText(getTimestampPDF());
        ct3.go();

        // Authorship
        ColumnText ct4 = new ColumnText(cb);
        ct4.setSimpleColumn(284, document.top() - 223, document.right(10), document.top() - 60, 20,
                Element.ALIGN_RIGHT);
        ct4.setLeading(0, 1.2f);
        ct4.addText(getAuthorshipPDF());
        ct4.go();

        // Pad text
        document.add(new Paragraph(" "));
        Paragraph p2 = new Paragraph();
        p2.setSpacingBefore(50);
        p2.setSpacingAfter(10);
        p2.add(new Chunk(" ", bodyFont));
        document.add(new Paragraph(p2));

        // Ring width table
        getRingWidthTable();
        document.add(getParagraphSpace());

        if (s.getSeries() instanceof TridasMeasurementSeries) {
            // MEASUREMENT SERIES

            //document.add(getRingRemarks());
            document.add(getWoodCompletenessPDF());
            document.add(getParagraphSpace());
            document.add(getSeriesComments());
            document.add(getParagraphSpace());
            document.add(getInterpretationPDF());
            document.add(getParagraphSpace());
            document.add(getElementAndSampleInfo());
        } else {
            // DERIVED SERIES
            getWJTable();
            document.add(getParagraphSpace());
            document.add(getSeriesComments());
            document.add(getParagraphSpace());
            //document.add(getRingRemarks());

        }

    } catch (DocumentException de) {
        System.err.println(de.getMessage());
    }

    // Close the document
    document.close();
}

From source file:org.tellervo.desktop.util.labels.PDFLabelMaker.java

License:Open Source License

public PDFLabelMaker(LabelPage margins, OutputStream output) throws IOException, DocumentException {
    this.margins = margins;

    float sides, page, h, w, labelGap;

    // calculate the number of labels wide this page is
    page = margins.getPageSize().getWidth();
    labelGap = margins.getLabelHorizontalGap();
    w = margins.getLabelWidth();//from w  ww.  j a  va  2  s .  c  o m
    sides = margins.getPageLeftMargin() + margins.getPageRightMargin();
    if (sides + w > page)
        throw new IllegalArgumentException("0 labels fit across");

    for (int i = 1; sides + (((float) i) * w) + (((float) (i - 1)) * labelGap) <= page; i++) {
        nAcross = i;
    }

    // the number of labels 'tall'
    page = margins.getPageSize().getHeight();
    labelGap = margins.getLabelVerticalGap();
    h = margins.getLabelHeight();
    sides = margins.getPageTopMargin() + margins.getPageBottomMargin();
    if (sides + h > page)
        throw new IllegalArgumentException("0 labels fit down");

    for (int i = 1; sides + (((float) i) * h) + (((float) (i - 1)) * labelGap) <= page; i++) {
        nDown = i;
    }

    System.out.println("LABELS: across: " + nAcross + ", down: " + nDown);

    document = new Document(margins.getPageSize());
    PdfWriter writer = PdfWriter.getInstance(document, output);
    document.addAuthor("Tellervo Label Generator");
    document.addCreationDate();

    document.open();

    contentb = writer.getDirectContent();
    // first off, pdfs are weird and go from high y coordinates to low for pages (ie, highest y = top of page)
    // also, this sets the page margins
    new ColumnText(contentb).setSimpleColumn(margins.getPageLeftMargin(), // lower x margin
            margins.getPageBottomMargin(), // bottom y margin
            margins.getPageSize().getWidth() - (margins.getPageRightMargin() + margins.getPageLeftMargin()), // upper x margin
            margins.getPageSize().getHeight() - (margins.getPageTopMargin() + margins.getPageBottomMargin()), // upper y margin
            0, // no leading
            Element.ALIGN_MIDDLE // align in the middle of the label
    );

    int realCols = nAcross + nAcross - 1; // number of labels + number of intra-label gaps

    float colwidth[] = new float[realCols];
    float totalWidth = 0;
    for (int i = 0; i < realCols; i++) {
        if ((i & 1) == 1) {
            // odd, so it's a margin
            totalWidth += margins.getLabelHorizontalGap();
            colwidth[i] = margins.getLabelHorizontalGap();
        } else {
            // even, so it's an actual label
            totalWidth += margins.getLabelWidth();
            colwidth[i] = margins.getLabelWidth();
        }
    }

    table = new PdfPTable(realCols);
    table.setTotalWidth(totalWidth);
    table.setWidths(colwidth);
    table.setLockedWidth(true);
    table.getDefaultCell().setPadding(0);
    table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_MIDDLE);
    table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);

}

From source file:org.unitime.timetable.export.solver.ExportTimetablePDF.java

License:Apache License

protected void printTables(FilterInterface filter, TimetableGridResponse response, ExportHelper helper)
        throws IOException {
    helper.setup("application/pdf", reference(), true);
    try {// w  w  w.ja  v  a 2 s.com
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, helper.getOutputStream());
        writer.setPageEvent(new PdfEventHandler());
        int index = 0;
        int margin = 50;
        int width = 1000;
        for (TimetableGridModel model : response.getModels())
            width = Math.max(width, pageWidth(filter, model, response.getWeekOffset()));
        int displayMode = Integer.valueOf(filter.getParameterValue("dispMode", "0"));
        int height = (displayMode == 2 ? (2 * margin + width) * 22 / 17 - 2 * margin
                : (2 * margin + width) * 17 / 22 - 2 * margin);
        for (TimetableGridModel model : response.getModels())
            height = Math.max(height, pageHeight(filter, model, response.getWeekOffset(), true));
        document.setPageSize(new Rectangle(width + 2 * margin, height + 2 * margin));
        document.setMargins(margin, margin, margin, margin);
        document.open();
        int used = 0;
        if (Integer.valueOf(filter.getParameterValue("dispMode", "0")) == 0) {
            boolean hasDay[] = { true, true, true, true, true, false, false };
            String days = filter.getParameterValue("days");
            if (days != null && days.length() == 7 && days.indexOf('1') >= 0) {
                for (int i = 0; i < 7; i++)
                    hasDay[i] = (days.charAt(i) == '1');
            }
            for (int i = 0; i < 7; i++) {
                if (!hasDay[i])
                    continue;
                String d = "";
                for (int j = 0; j < 7; j++)
                    d += (i == j ? "1" : "0");
                filter.getParameter("days").setValue(d);
                boolean first = true;
                for (TimetableGridModel model : response.getModels()) {
                    if (used > 0
                            && pageHeight(filter, model, response.getWeekOffset(), first) > height - used) {
                        document.newPage();
                        used = 0;
                    }
                    TimetableGrid tg = new TimetableGrid(filter, model, index++, width,
                            response.getWeekOffset(), used == 0 || first);
                    PdfContentByte canvas = writer.getDirectContent();
                    tg.print(canvas, margin, margin + used, height + 2 * margin, null);
                    used += tg.getHeight();
                    first = false;
                }
                used += 25;
            }
        } else {
            for (TimetableGridModel model : response.getModels()) {
                if (used > 0 && pageHeight(filter, model, response.getWeekOffset(), false) > height - used) {
                    document.newPage();
                    used = 0;
                }
                TimetableGrid tg = new TimetableGrid(filter, model, index++, width, response.getWeekOffset(),
                        used == 0);
                PdfContentByte canvas = writer.getDirectContent();
                tg.print(canvas, margin, margin + used, height + 2 * margin, null);
                used += tg.getHeight() + 25;
            }
        }
        if (document != null)
            document.close();
    } catch (DocumentException e) {
        throw new IOException(e.getMessage(), e);
    }
}

From source file:org.unitime.timetable.util.PdfEventHandler.java

License:Open Source License

/**
 * Print footer string on each page/*from   w  w  w  .  ja  v  a2 s  . co m*/
 * @param writer
 * @param document
 */
public void onEndPage(PdfWriter writer, Document document) {

    if (getDateTime() == null) {
        setDateTime(new Date());
    }

    PdfContentByte cb = writer.getDirectContent();
    cb.beginText();
    cb.setFontAndSize(getBaseFont(), getFontSize());
    cb.showTextAligned(PdfContentByte.ALIGN_LEFT, getDateFormat().format(getDateTime()), document.left(), 20,
            0);
    cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, String.valueOf(document.getPageNumber()), document.right(),
            20, 0);
    cb.showTextAligned(PdfContentByte.ALIGN_CENTER, MESSAGES.pdfCopyright(Constants.getVersion()),
            (document.left() + document.right()) / 2, 20, 0);
    cb.endText();

    return;
}

From source file:org.vfny.geoserver.wms.responses.map.pdf.PDFMapProducer.java

License:Open Source License

/**
 * Writes the image to the client./*from  w ww .j a va 2 s . c  o m*/
 * 
 * @param out
 *            The output stream to write to.
 */
public void writeTo(OutputStream out) throws ServiceException, java.io.IOException {
    final int width = mapContext.getMapWidth();
    final int height = mapContext.getMapHeight();

    if (LOGGER.isLoggable(Level.FINE)) {
        LOGGER.fine("setting up " + width + "x" + height + " image");
    }

    try {
        // step 1: creation of a document-object
        // width of document-object is width*72 inches
        // height of document-object is height*72 inches
        com.lowagie.text.Rectangle pageSize = new com.lowagie.text.Rectangle(width, height);

        Document document = new Document(pageSize);
        document.setMargins(0, 0, 0, 0);

        // step 2: creation of the writer
        PdfWriter writer = PdfWriter.getInstance(document, out);

        // step 3: we open the document
        document.open();

        // step 4: we grab the ContentByte and do some stuff with it

        // we create a fontMapper and read all the fonts in the font
        // directory
        DefaultFontMapper mapper = new DefaultFontMapper();
        FontFactory.registerDirectories();

        // we create a template and a Graphics2D object that corresponds
        // with it
        PdfContentByte cb = writer.getDirectContent();
        PdfTemplate tp = cb.createTemplate(width, height);
        PdfGraphics2D graphic = (PdfGraphics2D) tp.createGraphics(width, height, mapper);

        // we set graphics options
        if (!mapContext.isTransparent()) {
            graphic.setColor(mapContext.getBgColor());
            graphic.fillRect(0, 0, width, height);
        } else {
            if (LOGGER.isLoggable(Level.FINE)) {
                LOGGER.fine("setting to transparent");
            }

            int type = AlphaComposite.SRC;
            graphic.setComposite(AlphaComposite.getInstance(type));

            Color c = new Color(mapContext.getBgColor().getRed(), mapContext.getBgColor().getGreen(),
                    mapContext.getBgColor().getBlue(), 0);
            graphic.setBackground(mapContext.getBgColor());
            graphic.setColor(c);
            graphic.fillRect(0, 0, width, height);

            type = AlphaComposite.SRC_OVER;
            graphic.setComposite(AlphaComposite.getInstance(type));
        }

        Rectangle paintArea = new Rectangle(width, height);

        renderer = new StreamingRenderer();
        renderer.setContext(mapContext);
        // TODO: expose the generalization distance as a param
        // ((StreamingRenderer) renderer).setGeneralizationDistance(0);

        RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        renderer.setJava2DHints(hints);

        // we already do everything that the optimized data loading does...
        // if we set it to true then it does it all twice...
        Map rendererParams = new HashMap();
        rendererParams.put("optimizedDataLoadingEnabled", new Boolean(true));
        rendererParams.put("renderingBuffer", new Integer(mapContext.getBuffer()));
        // we need the renderer to draw everything on the batik provided graphics object
        rendererParams.put(StreamingRenderer.OPTIMIZE_FTS_RENDERING_KEY, Boolean.FALSE);
        if (!DefaultWebMapService.isLineWidthOptimizationEnabled()) {
            rendererParams.put(StreamingRenderer.LINE_WIDTH_OPTIMIZATION_KEY, false);
        }
        renderer.setRendererHints(rendererParams);

        Envelope dataArea = mapContext.getAreaOfInterest();
        AffineTransform at = RendererUtilities.worldToScreenTransform(dataArea, paintArea);

        if (this.abortRequested) {
            graphic.dispose();
            // step 5: we close the document
            document.close();

            return;
        }

        // enforce no more than x rendering errors
        int maxErrors = wms.getMaxRenderingErrors();
        MaxErrorEnforcer errorChecker = new MaxErrorEnforcer(renderer, maxErrors);

        // Add a render listener that ignores well known rendering exceptions and reports back non
        // ignorable ones
        final RenderExceptionStrategy nonIgnorableExceptionListener;
        nonIgnorableExceptionListener = new RenderExceptionStrategy(renderer);
        renderer.addRenderListener(nonIgnorableExceptionListener);

        // enforce max memory usage
        int maxMemory = wms.getMaxRequestMemory() * KB;
        PDFMaxSizeEnforcer memoryChecker = new PDFMaxSizeEnforcer(renderer, graphic, maxMemory);

        // render the map
        renderer.paint(graphic, paintArea, at);

        // render the watermark
        MapDecorationLayout.Block watermark = DefaultRasterMapProducer
                .getWatermark(this.mapContext.getRequest().getWMS().getServiceInfo());

        if (watermark != null) {
            MapDecorationLayout layout = new MapDecorationLayout();
            layout.paint(graphic, paintArea, this.mapContext);
        }

        //check if a non ignorable error occurred
        if (nonIgnorableExceptionListener.exceptionOccurred()) {
            Exception renderError = nonIgnorableExceptionListener.getException();
            throw new WmsException("Rendering process failed", "internalError", renderError);
        }

        // check if too many errors occurred
        if (errorChecker.exceedsMaxErrors()) {
            throw new WmsException("More than " + maxErrors + " rendering errors occurred, bailing out",
                    "internalError", errorChecker.getLastException());
        }

        // check we did not use too much memory
        if (memoryChecker.exceedsMaxSize()) {
            long kbMax = maxMemory / KB;
            throw new WmsException(
                    "Rendering request used more memory than the maximum allowed:" + kbMax + "KB");
        }

        graphic.dispose();
        cb.addTemplate(tp, 0, 0);

        // step 5: we close the document
        document.close();
        writer.flush();
        writer.close();
    } catch (DocumentException t) {
        throw new WmsException("Error setting up the PDF", "internalError", t);
    }
}