List of usage examples for org.apache.poi.xslf.usermodel XSLFSlide createTextBox
@Override
public XSLFTextBox createTextBox()
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(); }