Example usage for org.apache.poi.xslf.usermodel XSLFSlide createTextBox

List of usage examples for org.apache.poi.xslf.usermodel XSLFSlide createTextBox

Introduction

In this page you can find the example usage for org.apache.poi.xslf.usermodel XSLFSlide createTextBox.

Prototype

@Override
    public XSLFTextBox createTextBox() 

Source Link

Usage

From source file:com.hp.autonomy.frontend.reports.powerpoint.PowerPointServiceImpl.java

License:MIT License

@Override
public XMLSlideShow table(final TableData tableData, final String title) throws TemplateLoadException {
    final int rows = tableData.getRows(), cols = tableData.getCols();
    final String[] data = tableData.getCells();

    final XMLSlideShow ppt = loadTemplate().getSlideShow();
    final XSLFSlide sl = ppt.createSlide();

    final Rectangle2D.Double pageAnchor = createPageAnchor(ppt);

    final double textHeight;

    if (StringUtils.isNotBlank(title)) {
        textHeight = 0.1 * pageAnchor.getHeight();
        final XSLFTextBox textBox = sl.createTextBox();
        textBox.setText(title);/*ww  w  .j a  v a2 s  .c  o  m*/
        textBox.setHorizontalCentered(true);
        textBox.setTextAutofit(TextShape.TextAutofit.SHAPE);
        textBox.setAnchor(startingSpace(pageAnchor, textHeight));
    } else {
        textHeight = 0;
    }

    addTable(sl, remainingSpace(pageAnchor, textHeight), rows, cols, data, false);

    return ppt;
}

From source file:com.hp.autonomy.frontend.reports.powerpoint.PowerPointServiceImpl.java

License:MIT License

@Override
public XMLSlideShow map(final MapData map, final String title) throws TemplateLoadException {
    final String image = map.getImage();

    final XMLSlideShow ppt = loadTemplate().getSlideShow();
    final XSLFSlide sl = ppt.createSlide();

    final Rectangle2D.Double pageAnchor = createPageAnchor(ppt);
    final double textHeight;

    if (StringUtils.isNotBlank(title)) {
        textHeight = 0.1 * pageAnchor.getHeight();

        final XSLFTextBox textBox = sl.createTextBox();
        textBox.clearText();/*ww w .j a va  2  s.co m*/
        final XSLFTextParagraph paragraph = textBox.addNewTextParagraph();
        paragraph.setTextAlign(TextParagraph.TextAlign.CENTER);
        paragraph.addNewTextRun().setText(title);
        textBox.setHorizontalCentered(true);
        textBox.setTextAutofit(TextShape.TextAutofit.SHAPE);
        textBox.setAnchor(startingSpace(pageAnchor, textHeight));
    } else {
        textHeight = 0;
    }

    final XSLFPictureData picture = addPictureData(imageSource, ppt, image);
    addMap(sl, remainingSpace(pageAnchor, textHeight), picture, map.getMarkers(), map.getPolygons());

    return ppt;
}

From source file:com.hp.autonomy.frontend.reports.powerpoint.PowerPointServiceImpl.java

License:MIT License

/**
 * Internal implementation to add a list of documents to a presentation; either as a single slide or a series of slides.
 * @param imageSource the image source to convert images to data.
 * @param ppt the presentation to add to.
 * @param sl the slide to add to (can be null if pagination is enabled).
 * @param anchor bounding rectangle to draw onto, in PowerPoint coordinates.
 * @param paginate whether to render results as multiple slides if they don't fit on one slide.
 * @param data the documents to render.//from  w w  w.  j  a v  a  2s.c om
 * @param results optional string to render into the top-left corner of the available space.
 *                  Will appear on each page if pagination is enabled.
 * @param sortBy optional string to render into the top-right corner of the available space.
 *                  Will appear on each page if pagination is enabled.
 */
private static void addList(final ImageSource imageSource, final XMLSlideShow ppt, XSLFSlide sl,
        final Rectangle2D.Double anchor, final boolean paginate, final ListData data, final String results,
        final String sortBy) {
    final double
    // How much space to leave at the left and right edge of the slide
    xMargin = 20,
            // How much space to leave at the top
            yMargin = 5,
            // Size of the icon
            iconWidth = 20, iconHeight = 24,
            // Find's thumbnail height is 97px by 55px, hardcoded in the CSS in .document-thumbnail
            thumbScale = 0.8, thumbW = 97 * thumbScale, thumbH = 55 * thumbScale,
            // Margin around the thumbnail
            thumbMargin = 4.,
            // Space between list items
            listItemMargin = 5.;

    final Pattern highlightPattern = Pattern
            .compile("<HavenSearch-QueryText-Placeholder>(.*?)</HavenSearch-QueryText-Placeholder>");

    double yCursor = yMargin + anchor.getMinY(), xCursor = xMargin + anchor.getMinX();

    int docsOnPage = 0;

    final Document[] docs = data.getDocs();
    for (int docIdx = 0; docIdx < docs.length; ++docIdx) {
        final Document doc = docs[docIdx];

        if (sl == null) {
            sl = ppt.createSlide();
            yCursor = yMargin + anchor.getMinY();
            xCursor = xMargin + anchor.getMinX();
            docsOnPage = 0;

            double yStep = 0;

            if (StringUtils.isNotBlank(results)) {
                final XSLFTextBox textBox = sl.createTextBox();
                textBox.clearText();
                final Rectangle2D.Double textBounds = new Rectangle2D.Double(xCursor, yCursor,
                        Math.max(0, anchor.getMaxX() - xCursor - xMargin), 20);
                textBox.setAnchor(textBounds);

                addTextRun(textBox.addNewTextParagraph(), results, 12., Color.LIGHT_GRAY);

                yStep = textBox.getTextHeight();
            }

            if (StringUtils.isNotBlank(sortBy)) {
                final XSLFTextBox sortByEl = sl.createTextBox();
                sortByEl.clearText();
                final XSLFTextParagraph sortByText = sortByEl.addNewTextParagraph();
                sortByText.setTextAlign(TextParagraph.TextAlign.RIGHT);

                addTextRun(sortByText, sortBy, 12., Color.LIGHT_GRAY);

                sortByEl.setAnchor(new Rectangle2D.Double(xCursor, yCursor,
                        Math.max(0, anchor.getMaxX() - xCursor - xMargin), 20));

                yStep = Math.max(sortByEl.getTextHeight(), yStep);
            }

            if (yStep > 0) {
                yCursor += listItemMargin + yStep;
            }
        }

        XSLFAutoShape icon = null;
        if (data.isDrawIcons()) {
            icon = sl.createAutoShape();
            icon.setShapeType(ShapeType.SNIP_1_RECT);
            icon.setAnchor(new Rectangle2D.Double(xCursor, yCursor + listItemMargin, iconWidth, iconHeight));
            icon.setLineColor(Color.decode("#888888"));
            icon.setLineWidth(2.0);

            xCursor += iconWidth;
        }

        final XSLFTextBox listEl = sl.createTextBox();
        listEl.clearText();
        listEl.setAnchor(new Rectangle2D.Double(xCursor, yCursor,
                Math.max(0, anchor.getMaxX() - xCursor - xMargin), Math.max(0, anchor.getMaxY() - yCursor)));

        final XSLFTextParagraph titlePara = listEl.addNewTextParagraph();
        addTextRun(titlePara, doc.getTitle(), data.getTitleFontSize(), Color.BLACK).setBold(true);

        if (StringUtils.isNotBlank(doc.getDate())) {
            final XSLFTextParagraph datePara = listEl.addNewTextParagraph();
            datePara.setLeftMargin(5.);
            addTextRun(datePara, doc.getDate(), data.getDateFontSize(), Color.GRAY).setItalic(true);
        }

        if (StringUtils.isNotBlank(doc.getRef())) {
            addTextRun(listEl.addNewTextParagraph(), doc.getRef(), data.getRefFontSize(), Color.GRAY);
        }

        final double thumbnailOffset = listEl.getTextHeight();

        final XSLFTextParagraph contentPara = listEl.addNewTextParagraph();

        Rectangle2D.Double pictureAnchor = null;
        XSLFPictureData pictureData = null;

        if (StringUtils.isNotBlank(doc.getThumbnail())) {
            try {
                // Picture reuse is automatic
                pictureData = addPictureData(imageSource, ppt, doc.getThumbnail());
                // We reserve space for the picture, but we don't actually add it yet.
                // The reason is we may have to remove it later if it doesn't fit; but due to a quirk of OpenOffice,
                //   deleting the picture shape removes the pictureData as well; which is a problem since the
                //   pictureData can be shared between multiple pictures.
                pictureAnchor = new Rectangle2D.Double(xCursor, yCursor + thumbnailOffset + thumbMargin, thumbW,
                        thumbH);

                // If there is enough horizontal space, put the text summary to the right of the thumbnail image,
                //    otherwise put it under the thumbnail,
                if (listEl.getAnchor().getWidth() > 2.5 * thumbW) {
                    contentPara.setLeftMargin(thumbW);
                } else {
                    contentPara.addLineBreak().setFontSize(thumbH);
                }

            } catch (RuntimeException e) {
                // if there's any errors, we'll just ignore the image
            }
        }

        final String rawSummary = doc.getSummary();
        if (StringUtils.isNotBlank(rawSummary)) {
            // HTML treats newlines and multiple whitespace as a single whitespace.
            final String summary = rawSummary.replaceAll("\\s+", " ");
            final Matcher matcher = highlightPattern.matcher(summary);
            int idx = 0;

            while (matcher.find()) {
                final int start = matcher.start();

                if (idx < start) {
                    addTextRun(contentPara, summary.substring(idx, start), data.getSummaryFontSize(),
                            Color.DARK_GRAY);
                }

                addTextRun(contentPara, matcher.group(1), data.getSummaryFontSize(), Color.DARK_GRAY)
                        .setBold(true);
                idx = matcher.end();
            }

            if (idx < summary.length()) {
                addTextRun(contentPara, summary.substring(idx), data.getSummaryFontSize(), Color.DARK_GRAY);
            }
        }

        double elHeight = Math.max(listEl.getTextHeight(), iconHeight);
        if (pictureAnchor != null) {
            elHeight = Math.max(elHeight, pictureAnchor.getMaxY() - yCursor);
        }

        yCursor += elHeight;
        xCursor = xMargin + anchor.getMinX();

        docsOnPage++;

        if (yCursor > anchor.getMaxY()) {
            if (docsOnPage > 1) {
                // If we drew more than one list element on this page; and we exceeded the available space,
                //   delete the last element's shapes and redraw it on the next page.
                // We don't have to remove the picture since we never added it.
                sl.removeShape(listEl);
                if (icon != null) {
                    sl.removeShape(icon);
                }

                --docIdx;
            } else if (pictureAnchor != null) {
                // We've confirmed we need the picture, add it.
                sl.createPicture(pictureData).setAnchor(pictureAnchor);
            }

            sl = null;

            if (!paginate) {
                break;
            }
        } else {
            yCursor += listItemMargin;

            if (pictureAnchor != null) {
                // We've confirmed we need the picture, add it.
                sl.createPicture(pictureData).setAnchor(pictureAnchor);
            }
        }
    }
}

From source file:com.hp.autonomy.frontend.reports.powerpoint.PowerPointServiceImpl.java

License:MIT License

@Override
public XMLSlideShow report(final ReportData report, final boolean slidePerVisualizer)
        throws TemplateLoadException {
    final SlideShowTemplate template = loadTemplate();
    final XMLSlideShow ppt = template.getSlideShow();

    final Rectangle2D.Double pageAnchor = createPageAnchor(ppt);
    double width = pageAnchor.getWidth();
    double height = pageAnchor.getHeight();

    if (!slidePerVisualizer) {
        // If drawing multiple visualizations on a single slide, we need to render the charts first since adding
        //   chart objects directly via XML after calling slide.getShapes() or createShape() etc. will break things.
        Arrays.sort(report.getChildren(), Comparator.comparingInt(PowerPointServiceImpl::prioritizeCharts));
    }//  w  w w.j av  a 2s  . c o m

    // As above, we need to have a separate slide to place our sizing textbox for calculations.
    XSLFSlide sizingSlide = ppt.createSlide();
    // This is the slide to draw on.
    XSLFSlide slide = ppt.createSlide();

    int shapeId = 1;
    boolean first = true;

    for (final ReportData.Child child : report.getChildren()) {
        if (slidePerVisualizer && !first) {
            sizingSlide = ppt.createSlide();
            slide = ppt.createSlide();
        }

        first = false;

        final ComposableElement data = child.getData();
        final Rectangle2D.Double anchor = new Rectangle2D.Double(pageAnchor.getMinX() + width * child.getX(),
                pageAnchor.getMinY() + height * child.getY(), width * child.getWidth(),
                height * child.getHeight());

        if (child.getMargin() >= 0) {
            final double margin = child.getMargin();
            final double marginX2 = margin * 2;
            final double textMargin = child.getTextMargin();

            if (anchor.getWidth() > marginX2) {
                double xCursor = anchor.getMinX() + margin, xWidthAvail = anchor.getWidth() - marginX2,
                        yCursor = anchor.getMinY() + margin, yHeightAvail = anchor.getHeight() - marginX2;
                XSLFTextBox sizingBox = null;

                final String title = child.getTitle();
                if (StringUtils.isNotEmpty(title) && yHeightAvail > 0) {
                    sizingBox = sizingSlide.createTextBox();
                    final Rectangle2D.Double sizingAnchor = new Rectangle2D.Double(xCursor, yCursor,
                            xWidthAvail, yHeightAvail);
                    sizingBox.setAnchor(sizingAnchor);
                    sizingBox.clearText();
                    addTextRun(sizingBox.addNewTextParagraph(), title, child.getFontSize(), Color.BLACK)
                            .setFontFamily(child.getFontFamily());

                    final double textHeight = sizingBox.getTextHeight() + textMargin;
                    yCursor += textHeight;
                    yHeightAvail -= textHeight;
                }

                if (yHeightAvail > 0) {
                    anchor.setRect(xCursor, yCursor, xWidthAvail, yHeightAvail);
                } else if (sizingBox != null) {
                    sizingSlide.removeShape(sizingBox);
                }
            }
        }

        if (data instanceof DategraphData) {
            addDategraph(template, slide, anchor, (DategraphData) data, shapeId, "relId" + shapeId);
            shapeId++;
        } else if (data instanceof ListData) {
            final ListData listData = (ListData) data;
            addList(imageSource, ppt, slide, anchor, false, listData, null, null);
        } else if (data instanceof MapData) {
            final MapData mapData = (MapData) data;
            addMap(slide, anchor, addPictureData(imageSource, ppt, mapData.getImage()), mapData.getMarkers(),
                    mapData.getPolygons());
        } else if (data instanceof SunburstData) {
            addSunburst(template, slide, anchor, (SunburstData) data, shapeId, "relId" + shapeId);
            shapeId++;
        } else if (data instanceof TableData) {
            final TableData tableData = (TableData) data;
            addTable(slide, anchor, tableData.getRows(), tableData.getCols(), tableData.getCells(), true);
        } else if (data instanceof TopicMapData) {
            addTopicMap(slide, anchor, (TopicMapData) data);
        } else if (data instanceof TextData) {
            addTextData(slide, anchor, (TextData) data);
        }

        if (slidePerVisualizer) {
            transferSizedTextboxes(ppt, slide, sizingSlide);
        }
    }

    if (!slidePerVisualizer) {
        transferSizedTextboxes(ppt, slide, sizingSlide);
    }

    return ppt;
}

From source file:com.hp.autonomy.frontend.reports.powerpoint.PowerPointServiceImpl.java

License:MIT License

private static void transferSizedTextboxes(final XMLSlideShow ppt, final XSLFSlide slide,
        final XSLFSlide sizingSlide) {
    // Clone all text boxes to the original slide afterward, and remove the sizing slide
    for (XSLFShape shape : sizingSlide.getShapes()) {
        if (shape instanceof XSLFTextBox) {
            final XSLFTextBox src = (XSLFTextBox) shape;
            final XSLFTextBox textBox = slide.createTextBox();
            textBox.setAnchor(src.getAnchor());
            textBox.clearText();//from  www . j  a  v a  2  s.  com
            src.forEach(
                    srcPara -> textBox.addNewTextParagraph().getXmlObject().set(srcPara.getXmlObject().copy()));
        }
    }

    ppt.removeSlide(ppt.getSlides().indexOf(sizingSlide));
}

From source file:com.hp.autonomy.frontend.reports.powerpoint.PowerPointServiceImpl.java

License:MIT License

/**
 * Utility function to render a TextData object as multiple text runs on the screen in a single text paragraph.
 * Note that newlines are not added automatically; this is so we can support adjacent text with different formatting.
 * @param slide the slide to add to.//from   w w  w.ja v  a  2s. com
 * @param anchor bounding rectangle to draw onto, in PowerPoint coordinates.
 * @param data the text data to render.
 */
private void addTextData(final XSLFSlide slide, final Rectangle2D.Double anchor, final TextData data) {
    final XSLFTextBox textBox = slide.createTextBox();
    textBox.setAnchor(anchor);
    textBox.clearText();

    final XSLFTextParagraph para = textBox.addNewTextParagraph();

    for (final TextData.Paragraph runData : data.getText()) {
        final XSLFTextRun run = para.addNewTextRun();
        run.setText(runData.getText());
        run.setFontSize(runData.getFontSize());
        run.setBold(runData.isBold());
        run.setItalic(runData.isItalic());
        run.setFontColor(Color.decode(runData.getColor()));

        if (textBox.getTextHeight() > anchor.getHeight()) {
            // Try removing words from the last box until we find something that fits, or we run out of words
            final String trimmedText = runData.getText().trim();
            run.setText(trimmedText);

            for (final StringBuilder text = new StringBuilder(trimmedText); textBox.getTextHeight() > anchor
                    .getHeight() && text.length() > 0;) {
                final int lastSpaceIdx = Math.max(text.lastIndexOf(" "), text.lastIndexOf("\n"));

                if (lastSpaceIdx < 0) {
                    break;
                }

                text.delete(lastSpaceIdx, text.length());
                // Add a trailing ellipsis unless it's empty or already contained a trailing ellipsis or "..." at the final truncated position.
                run.setText(
                        text.length() > 0 ? text.toString().replaceFirst("(\\s*(\\.{3}|\u2026))?$", "\u2026")
                                : "");
            }

            // The font metrics aren't going to be perfect (due to unavailability of fonts etc.) so we force the truncated text to fit.
            textBox.setTextAutofit(TextShape.TextAutofit.NORMAL);

            break;
        }
    }
}

From source file:info.opencards.util.playground.SlidesAndShapes.java

License:Apache License

public static void main(String[] args) throws Exception {
    XMLSlideShow ppt = new XMLSlideShow();
    ppt.setPageSize(new Dimension(792, 612));

    XSLFSlide slide1 = ppt.createSlide();
    XSLFTextBox textBox = slide1.createTextBox();
    XSLFTextRun r1 = textBox.addNewTextParagraph().addNewTextRun();
    r1.setBold(true);// w ww. ja v  a  2s .  co m
    r1.setItalic(true);
    r1.setFontColor(Color.yellow);
    r1.setFontFamily("Arial");
    r1.setFontSize(24);
    r1.setText("Apache");
    XSLFTextRun r2 = textBox.addNewTextParagraph().addNewTextRun();
    r2.setStrikethrough(true);
    r2.setUnderline(true);
    r2.setText("POI\u2122");
    XSLFTextRun r3 = textBox.addNewTextParagraph().addNewTextRun();
    r3.setFontFamily("Wingdings");
    r3.setText(" Version 3.8");

    textBox.setAnchor(new Rectangle(50, 50, 200, 100));
    textBox.setLineColor(Color.black);
    textBox.setFillColor(Color.orange);

    XSLFAutoShape shape2 = slide1.createAutoShape();

    shape2.setAnchor(new Rectangle(100, 100, 200, 200));

    XSLFFreeformShape shape3 = slide1.createFreeform();
    Rectangle rect = new Rectangle(150, 150, 300, 300);
    GeneralPath path = new GeneralPath(rect);
    path.append(new Ellipse2D.Double(200, 200, 100, 50), false);
    shape3.setPath(path);
    shape3.setAnchor(path.getBounds2D());
    shape3.setLineColor(Color.black);
    shape3.setFillColor(Color.lightGray);

    XSLFSlide slide2 = ppt.createSlide();
    XSLFGroupShape group = slide2.createGroup();

    group.setAnchor(new Rectangle(0, 0, 792, 612));
    group.setInteriorAnchor(new Rectangle(-10, -10, 20, 20));

    XSLFAutoShape shape4 = group.createAutoShape();
    shape4.setAnchor(new Rectangle(0, 0, 5, 5));
    shape4.setLineWidth(5);
    shape4.setLineColor(Color.black);

    FileOutputStream out = new FileOutputStream("xslf-demo.pptx");
    ppt.write(out);
    out.close();
}

From source file:poi.xslf.usermodel.Tutorial2.java

License:Apache License

public static void main(String[] args) throws IOException {
    XMLSlideShow ppt = new XMLSlideShow();

    XSLFSlide slide1 = ppt.createSlide();
    XSLFTextBox shape1 = slide1.createTextBox();
    // initial height of the text box is 100 pt but
    Rectangle anchor = new Rectangle(10, 100, 300, 100);
    shape1.setAnchor(anchor);//from w w  w  .j  a va  2 s.  c o m

    XSLFTextParagraph p1 = shape1.addNewTextParagraph();
    XSLFTextRun r1 = p1.addNewTextRun();
    r1.setText("Paragraph Formatting");
    r1.setFontSize(24);
    r1.setFontColor(new Color(85, 142, 213));

    XSLFTextParagraph p2 = shape1.addNewTextParagraph();
    // If spaceBefore >= 0, then space is a percentage of normal line height.
    // If spaceBefore < 0, the absolute value of linespacing is the spacing in points
    p2.setSpaceBefore(-20); // 20 pt from the previous paragraph
    p2.setSpaceAfter(300); // 3 lines after the paragraph
    XSLFTextRun r2 = p2.addNewTextRun();
    r2.setText("Paragraph  properties apply to all text residing within the corresponding paragraph.");
    r2.setFontSize(16);

    XSLFTextParagraph p3 = shape1.addNewTextParagraph();

    XSLFTextRun r3 = p3.addNewTextRun();
    r3.setText("Run Formatting");
    r3.setFontSize(24);
    r3.setFontColor(new Color(85, 142, 213));

    XSLFTextParagraph p4 = shape1.addNewTextParagraph();
    p4.setSpaceBefore(-20); // 20 pt from the previous paragraph
    p4.setSpaceAfter(300); // 3 lines after the paragraph
    XSLFTextRun r4 = p4.addNewTextRun();
    r4.setFontSize(16);
    r4.setText("Run level formatting is the most granular property level and allows "
            + "for the specifying of all low level text properties. The text run is "
            + "what all paragraphs are derived from and thus specifying various "
            + "properties per run will allow for a diversely formatted text paragraph.");

    // resize the shape to fit text
    shape1.resizeToFitText();

    FileOutputStream out = new FileOutputStream("text.pptx");
    ppt.write(out);
    out.close();
}

From source file:poi.xslf.usermodel.Tutorial3.java

License:Apache License

public static void main(String[] args) throws IOException {
    XMLSlideShow ppt = new XMLSlideShow();

    XSLFSlide slide = ppt.createSlide();

    XSLFTextShape titleShape = slide.createTextBox();
    titleShape.setPlaceholder(Placeholder.TITLE);
    titleShape.setText("This is a slide title");
    titleShape.setAnchor(new Rectangle(50, 50, 400, 100));

    FileOutputStream out = new FileOutputStream("title.pptx");
    ppt.write(out);/*from  www .j a v  a 2 s.  com*/
    out.close();
}

From source file:poi.xslf.usermodel.Tutorial6.java

License:Apache License

public static void main(String[] args) throws IOException {
    XMLSlideShow ppt = new XMLSlideShow();

    XSLFSlide slide1 = ppt.createSlide();
    XSLFSlide slide2 = ppt.createSlide();

    XSLFTextBox shape1 = slide1.createTextBox();
    shape1.setAnchor(new Rectangle(50, 50, 200, 50));
    XSLFTextRun r1 = shape1.addNewTextParagraph().addNewTextRun();
    XSLFHyperlink link1 = r1.createHyperlink();
    r1.setText("http://poi.apache.org"); // visible text
    link1.setAddress("http://poi.apache.org"); // link address

    XSLFTextBox shape2 = slide1.createTextBox();
    shape2.setAnchor(new Rectangle(300, 50, 200, 50));
    XSLFTextRun r2 = shape2.addNewTextParagraph().addNewTextRun();
    XSLFHyperlink link2 = r2.createHyperlink();
    r2.setText("Go to the second slide"); // visible text
    link2.setAddress(slide2); // link address

    FileOutputStream out = new FileOutputStream("hyperlinks.pptx");
    ppt.write(out);/*from  w  ww.j  a  va  2 s . com*/
    out.close();
}