Example usage for com.lowagie.text.pdf PdfContentByte createTemplate

List of usage examples for com.lowagie.text.pdf PdfContentByte createTemplate

Introduction

In this page you can find the example usage for com.lowagie.text.pdf PdfContentByte createTemplate.

Prototype

public PdfTemplate createTemplate(float width, float height) 

Source Link

Document

Creates a new template.

Usage

From source file:org.jivesoftware.openfire.reporting.graph.GraphServlet.java

License:Open Source License

private void writePDFContent(HttpServletRequest request, HttpServletResponse response, JFreeChart charts[],
        Statistic[] stats, long starttime, long endtime, int width, int height) throws IOException {

    try {/*from  w w  w. j  a  va2 s .c o m*/
        Document document = new Document(PageSize.A4, 50, 50, 50, 50);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter writer = PdfWriter.getInstance(document, baos);
        writer.setPageEvent(new PDFEventListener(request));
        document.open();

        int index = 0;
        int chapIndex = 0;
        for (Statistic stat : stats) {

            String serverName = XMPPServer.getInstance().getServerInfo().getXMPPDomain();
            String dateName = JiveGlobals.formatDate(new Date(starttime)) + " - "
                    + JiveGlobals.formatDate(new Date(endtime));
            Paragraph paragraph = new Paragraph(serverName,
                    FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLD));
            document.add(paragraph);
            paragraph = new Paragraph(dateName, FontFactory.getFont(FontFactory.HELVETICA, 14, Font.PLAIN));
            document.add(paragraph);
            document.add(Chunk.NEWLINE);
            document.add(Chunk.NEWLINE);

            Paragraph chapterTitle = new Paragraph(++chapIndex + ". " + stat.getName(),
                    FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD));

            document.add(chapterTitle);
            // total hack: no idea what tags people are going to use in the description
            // possibly recommend that we only use a <p> tag?
            String[] paragraphs = stat.getDescription().split("<p>");
            for (String s : paragraphs) {
                Paragraph p = new Paragraph(s);
                document.add(p);
            }
            document.add(Chunk.NEWLINE);

            PdfContentByte contentByte = writer.getDirectContent();
            PdfTemplate template = contentByte.createTemplate(width, height);
            Graphics2D graphs2D = template.createGraphics(width, height, new DefaultFontMapper());
            Rectangle2D rectangle2D = new Rectangle2D.Double(0, 0, width, height);
            charts[index++].draw(graphs2D, rectangle2D);
            graphs2D.dispose();
            float x = (document.getPageSize().width() / 2) - (width / 2);
            contentByte.addTemplate(template, x, writer.getVerticalPosition(true) - height);
            document.newPage();
        }

        document.close();

        // setting some response headers
        response.setHeader("Expires", "0");
        response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        response.setHeader("Pragma", "public");
        // setting the content type
        response.setContentType("application/pdf");
        // the contentlength is needed for MSIE!!!
        response.setContentLength(baos.size());
        // write ByteArrayOutputStream to the ServletOutputStream
        ServletOutputStream out = response.getOutputStream();
        baos.writeTo(out);
        out.flush();
    } catch (DocumentException e) {
        Log.error("error creating PDF document: " + e.getMessage());

    }
}

From source file:org.locationtech.udig.project.ui.wizard.export.image.Image2Pdf.java

License:Open Source License

/**
 * writes a buffered image to pdf at a given resolution
 *
 *
 * @param image//from   www .ja v  a 2s.c o  m
 *            the image to write
 * @param pdfPath
 *            the path to the pdf document to create
 * @param paper
 *            the paper type
 * @param widthBorder
 *            border in pixels to use on the x-axis
 * @param heightBorder
 *            border in pixels to use on the y-axis
 * @param lanscape
 *            true if the document should be in landscape mode
 * @param dpi the output dpi
 */
public static void write(BufferedImage image, String pdfPath, Paper paper, int widthBorder, int heightBorder,
        boolean landscape, int dpi) {
    Dimension printPageSize = null;
    printPageSize = new Dimension(paper.getPixelWidth(landscape, dpi), paper.getPixelHeight(landscape, dpi));

    // step 1: creation of a document-object
    Document document = new Document(new Rectangle(printPageSize.width, printPageSize.height));

    try {

        // step 2:
        // we create a writer that listens to the document
        // and directs a PDF-stream to a file
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath));

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

        // step 4: we create a template and a Graphics2D object that
        // corresponds with it
        int w = printPageSize.width;
        int h = printPageSize.height;
        PdfContentByte cb = writer.getDirectContent();
        PdfTemplate tp = cb.createTemplate(w, h);
        Graphics2D g2 = tp.createGraphics(w, h);
        tp.setWidth(w);
        tp.setHeight(h);

        g2.drawImage(image, null, widthBorder, heightBorder);

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

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

    // step 5: we close the document
    document.close();
}

From source file:org.mapfish.print.PDFUtils.java

License:Open Source License

/**
 * Gets an iText image with a cache that uses PdfTemplates to re-use the same
 * bitmap content multiple times in order to reduce the file size.
 *///from w w w  . jav a  2s .c om
public static Image getImage(RenderingContext context, URI uri, float w, float h)
        throws IOException, DocumentException {
    //Check the image is not already used in the PDF file.
    //
    //This part is not protected against multi-threads... worst case, a single image can
    //be twice in the PDF, if used more than one time. But since only one !map
    //block is dealed with at a time, this should not happen
    Map<URI, PdfTemplate> cache = context.getTemplateCache();
    PdfTemplate template = cache.get(uri);
    if (template == null) {
        Image content = getImageDirect(context, uri);
        content.setAbsolutePosition(0, 0);
        final PdfContentByte dc = context.getDirectContent();
        synchronized (context.getPdfLock()) { //protect against parallel writing on the PDF file
            template = dc.createTemplate(content.getPlainWidth(), content.getPlainHeight());
            template.addImage(content);
        }
        cache.put(uri, template);
    }

    //fix the size/aspect ratio of the image in function of what is specified by the user
    if (w == 0.0f) {
        if (h == 0.0f) {
            w = template.getWidth();
            h = template.getHeight();
        } else {
            w = h / template.getHeight() * template.getWidth();
        }
    } else {
        if (h == 0.0f) {
            h = w / template.getWidth() * template.getHeight();
        }
    }

    final Image result = Image.getInstance(template);
    result.scaleToFit(w, h);
    return result;
}

From source file:org.openscience.jmol.app.jmolpanel.PdfCreator.java

License:Open Source License

public String createPdfDocument(String fileName, Image image) {
    Document document = new Document();
    File file = null;/* www . j  a va 2  s. co  m*/
    try {
        int w = image.getWidth(null);
        int h = image.getHeight(null);
        file = new File(fileName);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
        document.open();
        PdfContentByte cb = writer.getDirectContent();
        PdfTemplate tp = cb.createTemplate(w, h);
        Graphics2D g2 = tp.createGraphics(w, h);
        g2.setStroke(new BasicStroke(0.1f));
        tp.setWidth(w);
        tp.setHeight(h);
        g2.drawImage(image, 0, 0, w, h, 0, 0, w, h, null);
        g2.dispose();
        cb.addTemplate(tp, 72, 720 - h);
    } catch (DocumentException de) {
        return de.getMessage();
    } catch (IOException ioe) {
        return ioe.getMessage();
    }
    document.close();
    return null;
}

From source file:org.sakaiproject.evaluation.tool.reporting.EvalPDFReportBuilder.java

License:Educational Community License

/**
  * @param question//from   www.j a  va2  s .c o  m
  *            the question text
  * @param choices
  *            the text for the choices
  * @param values
  *            the count of answers for each choice (same order as choices)
  * @param responseCount
  *            the number of responses to the question
  * @param showPercentages
  *            if true then show the percentages
  * @param answersAndMean
  *            the text which will be displayed above the chart (normally the answers count and
  *            mean)
  * @param lastElementIsHeader
  *            If the last element was a header, the extra spacing paragraph is not needed.
  */
public void addLikertResponse(String question, String[] choices, int[] values, int responseCount,
        boolean showPercentages, String answersAndMean, boolean lastElementIsHeader) {
    ArrayList<Element> myElements = new ArrayList<>();

    try {
        if (!lastElementIsHeader) {
            Paragraph emptyPara = new Paragraph(" ");
            this.addElementWithJump(emptyPara, false);
        }

        Paragraph myPara = new Paragraph(question, questionTextFont);
        myPara.setSpacingAfter(SPACING_AFTER_HEADER);
        myElements.add(myPara);

        EvalLikertChartBuilder chartBuilder = new EvalLikertChartBuilder();
        chartBuilder.setValues(values);
        chartBuilder.setResponses(choices);
        chartBuilder.setShowPercentages(showPercentages);
        chartBuilder.setResponseCount(responseCount);
        JFreeChart chart = chartBuilder.makeLikertChart();

        /* The height is going to be based off the number of choices */
        int height = 15 * choices.length;

        PdfContentByte cb = pdfWriter.getDirectContent();
        PdfTemplate tp = cb.createTemplate(200, height);
        Graphics2D g2d = tp.createGraphics(200, height, new DefaultFontMapper());
        Rectangle2D r2d = new Rectangle2D.Double(0, 0, 200, height);
        chart.draw(g2d, r2d);
        g2d.dispose();
        Image image = Image.getInstance(tp);

        // put image in the document
        myElements.add(image);

        if (answersAndMean != null) {
            Paragraph header = new Paragraph(answersAndMean, paragraphFont);
            header.setSpacingAfter(SPACING_BETWEEN_LIST_ITEMS);
            myElements.add(header);
        }

        this.addElementArrayWithJump(myElements);
    } catch (BadElementException e) {
        // TODO Auto-generated catch block
        LOG.warn(e);
    }
}

From source file:org.schreibubi.JCombinations.ui.GridChartPanel.java

License:Open Source License

/**
 * Create PDF/*from   w ww.ja  va2s .  com*/
 * 
 * @param name
 *            Filename
 * @param selection
 *            Selected Nodes
 * @param dm
 *            DataModel
 * @param pl
 *            ProgressListener
 */
@SuppressWarnings("unchecked")
public static void generatePDF(File name, DataModel dm, ArrayList<TreePath> selection, ProgressListener pl) {
    com.lowagie.text.Document document = new Document(PageSize.A4.rotate(), 50, 50, 50, 50);
    try {
        ArrayList<ExtendedJFreeChart> charts = dm.getCharts(selection);
        if (charts.size() > 0) {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(name));
            writer.setViewerPreferences(PdfWriter.PageModeUseOutlines);
            document.addAuthor("Jrg Werner");
            document.addSubject("Created by JCombinations");
            document.addKeywords("JCombinations");
            document.addCreator("JCombinations using iText");

            // we define a header and a footer
            HeaderFooter header = new HeaderFooter(new Phrase("JCombinations by Jrg Werner"), false);
            HeaderFooter footer = new HeaderFooter(new Phrase("Page "), new Phrase("."));
            footer.setAlignment(Element.ALIGN_CENTER);
            document.setHeader(header);
            document.setFooter(footer);

            document.open();
            DefaultFontMapper mapper = new DefaultFontMapper();
            FontFactory.registerDirectories();
            mapper.insertDirectory("c:\\WINNT\\fonts");

            PdfContentByte cb = writer.getDirectContent();

            pl.progressStarted(new ProgressEvent(GridChartPanel.class, 0, charts.size()));
            for (int i = 0; i < charts.size(); i++) {
                ExtendedJFreeChart chart = charts.get(i);
                PdfTemplate tp = cb.createTemplate(document.right(EXTRA_MARGIN) - document.left(EXTRA_MARGIN),
                        document.top(EXTRA_MARGIN) - document.bottom(EXTRA_MARGIN));
                Graphics2D g2d = tp.createGraphics(document.right(EXTRA_MARGIN) - document.left(EXTRA_MARGIN),
                        document.top(EXTRA_MARGIN) - document.bottom(EXTRA_MARGIN), mapper);
                Rectangle2D r2d = new Rectangle2D.Double(0, 0,
                        document.right(EXTRA_MARGIN) - document.left(EXTRA_MARGIN),
                        document.top(EXTRA_MARGIN) - document.bottom(EXTRA_MARGIN));
                chart.draw(g2d, r2d);
                g2d.dispose();
                cb.addTemplate(tp, document.left(EXTRA_MARGIN), document.bottom(EXTRA_MARGIN));
                PdfDestination destination = new PdfDestination(PdfDestination.FIT);
                TreePath treePath = chart.getTreePath();
                PdfOutline po = cb.getRootOutline();
                for (int j = 0; j < treePath.getPathCount(); j++) {
                    ArrayList<PdfOutline> lpo = po.getKids();
                    PdfOutline cpo = null;
                    for (PdfOutline outline : lpo)
                        if (outline.getTitle().compareTo(treePath.getPathComponent(j).toString()) == 0)
                            cpo = outline;
                    if (cpo == null)
                        cpo = new PdfOutline(po, destination, treePath.getPathComponent(j).toString());
                    po = cpo;
                }
                document.newPage();
                pl.progressIncremented(new ProgressEvent(GridChartPanel.class, i));
            }
            document.close();
            pl.progressEnded(new ProgressEvent(GridChartPanel.class));

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

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 av  a  2 s  .  com*/
 * 
 * @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);
    }
}

From source file:peakml.graphics.JFreeChartTools.java

License:Open Source License

/**
 * This method writes the given graph to the output stream in the PDF format. As a vector
 * based file format it allows some freedom to be changed (e.g. colors, line thickness, etc.),
 * which can be convenient for presentation purposes.
 * /* ww w.  ja  v a2s. co  m*/
 * @param out         The output stream to write to.
 * @param chart         The chart to be written.
 * @param width         The width of the image.
 * @param height      The height of the image.
 * @throws IOException   Thrown when an error occurs with the IO.
 */
public static void writeAsPDF(OutputStream out, JFreeChart chart, int width, int height) throws IOException {
    Document document = new Document(new Rectangle(width, height), 50, 50, 50, 50);
    document.addAuthor("");
    document.addSubject("");

    try {
        PdfWriter writer = PdfWriter.getInstance(document, out);
        document.open();
        PdfContentByte cb = writer.getDirectContent();
        PdfTemplate tp = cb.createTemplate(width, height);

        java.awt.Graphics2D g2 = tp.createGraphics(width, height, new DefaultFontMapper());
        chart.draw(g2, new java.awt.geom.Rectangle2D.Double(0, 0, width, height));

        g2.dispose();
        cb.addTemplate(tp, 0, 0);
    } catch (DocumentException de) {
        throw new IOException(de.getMessage());
    }

    document.close();
}

From source file:PresentationLayer.CreatePuzzleJFrame.java

private void savePuzzlejButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_savePuzzlejButtonActionPerformed
    fileChooser.resetChoosableFileFilters();
    fileChooser.setAcceptAllFileFilterUsed(false);

    fileChooser.setDialogTitle("Save Puzzle");

    fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("PDF", "pdf"));
    //        fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("JPEG", "jpeg"));
    //        fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("JPG", "jpg"));
    //        fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("PNG", "png"));
    //        fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("BMP", "bmp"));

    int r = fileChooser.showSaveDialog(this);

    if (r == JFileChooser.APPROVE_OPTION) {

        String name = fileChooser.getSelectedFile().getAbsolutePath();
        String type = fileChooser.getFileFilter().getDescription();

        JPanel jPanelToPrint = printablejPanel;

        if (type.equals("PDF")) { //Save as pdf
            puzzlejTable.setBackground(Color.black);
            try {
                //                  Document document = new Document(PageSize.A4.rotate(), 50, 50, 50, 50);
                Document document = new Document(new Rectangle(docWidth, docHeight));
                PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(name + ".pdf"));
                document.open();//from  w w  w. j a  v a 2  s  .  com
                PdfContentByte cb = writer.getDirectContent();
                PdfTemplate tp = cb.createTemplate(jPanelToPrint.getWidth(), jPanelToPrint.getHeight());
                Graphics2D g2 = tp.createGraphics(jPanelToPrint.getWidth(), jPanelToPrint.getHeight());
                //g2.scale(0.8, 1.0);
                jPanelToPrint.print(g2);
                g2.dispose();
                cb.addTemplate(tp, 0, 0);
                document.close();
            } catch (DocumentException ex) {
                Logger.getLogger(CreatePuzzleJFrame.class.getName()).log(Level.SEVERE, null, ex);
            } catch (FileNotFoundException ex) {
                Logger.getLogger(CreatePuzzleJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
            puzzlejTable.setBackground(Color.white);

        } else { //Save as image

            BufferedImage bi = ScreenImage.createImage(jPanelToPrint);
            try {
                ScreenImage.writeImage(bi, name + "." + type.toLowerCase());
            } catch (IOException ex) {
                Logger.getLogger(CreatePuzzleJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}

From source file:questions.graphics2D.SplitCanvas.java

public static void main(String[] args) {
    Document document = new Document();
    try {//from  w w  w.j av  a 2  s . c  o  m
        document.setPageSize(new Rectangle(100, 100));
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(RESULT));
        document.open();
        // create the canvas for the complete drawing:
        PdfContentByte directContent = writer.getDirectContentUnder();
        PdfTemplate canvas = directContent.createTemplate(200, 200);
        Graphics2D g2d = canvas.createGraphicsShapes(200, 200);
        // draw to the complete drawing to the canvas:
        g2d.setPaint(new Color(150, 150, 255));
        g2d.setStroke(new BasicStroke(10.0f));
        g2d.drawArc(50, 50, 100, 100, 0, 360);
        g2d.dispose();
        // wrap the canvas inside an image:
        Image img = Image.getInstance(canvas);
        // distribute the image over 4 pages:
        img.setAbsolutePosition(0, -100);
        document.add(img);
        g2d = directContent.createGraphicsShapes(100, 100);
        g2d.setPaint(new Color(255, 150, 150));
        g2d.setStroke(new BasicStroke(5.0f));
        g2d.drawLine(25, 25, 25, 100);
        g2d.drawLine(25, 25, 100, 25);
        g2d.dispose();
        document.newPage();
        img.setAbsolutePosition(-100, -100);
        document.add(img);
        g2d = directContent.createGraphicsShapes(100, 100);
        g2d.setPaint(new Color(255, 150, 150));
        g2d.setStroke(new BasicStroke(5.0f));
        g2d.drawLine(0, 25, 75, 25);
        g2d.drawLine(75, 25, 75, 100);
        g2d.dispose();
        document.newPage();
        img.setAbsolutePosition(0, 0);
        document.add(img);
        g2d = directContent.createGraphicsShapes(100, 100);
        g2d.setPaint(new Color(255, 150, 150));
        g2d.setStroke(new BasicStroke(5.0f));
        g2d.drawLine(25, 0, 25, 75);
        g2d.drawLine(25, 75, 100, 75);
        g2d.dispose();
        document.newPage();
        img.setAbsolutePosition(-100, 0);
        document.add(img);
        g2d = directContent.createGraphicsShapes(100, 100);
        g2d.setPaint(new Color(255, 150, 150));
        g2d.setStroke(new BasicStroke(5.0f));
        g2d.drawLine(0, 75, 75, 75);
        g2d.drawLine(75, 0, 75, 75);
        g2d.dispose();
    } catch (DocumentException de) {
        de.printStackTrace();
        return;
    } catch (IOException ioe) {
        ioe.printStackTrace();
        return;
    }
    document.close();
}