Repository: openmeetings Updated Branches: refs/heads/master fbe9e48f3 -> e6e1e83da
[OPENMEETINGS-427] export to PDF is implemented Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/e6e1e83d Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/e6e1e83d Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/e6e1e83d Branch: refs/heads/master Commit: e6e1e83dad57aec284d6d02dfdf4531fc0cd0dd9 Parents: fbe9e48 Author: Maxim Solodovnik <solomax...@gmail.com> Authored: Thu Aug 10 23:06:57 2017 +0700 Committer: Maxim Solodovnik <solomax...@gmail.com> Committed: Thu Aug 10 23:06:57 2017 +0700 ---------------------------------------------------------------------- .../apache/openmeetings/web/room/RoomPanel.java | 48 ++++++++++++++++++++ .../web/room/menu/RoomMenuPanel.java | 8 ++-- .../openmeetings/web/room/wb/WbPanel.java | 33 ++++++++------ openmeetings-web/src/main/webapp/css/wb.css | 2 +- 4 files changed, 72 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e6e1e83d/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java index b540ce0..7fd3115 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java @@ -29,7 +29,11 @@ import static org.apache.openmeetings.web.app.Application.update; import static org.apache.openmeetings.web.app.WebSession.getDateFormat; import static org.apache.openmeetings.web.app.WebSession.getUserId; import static org.apache.openmeetings.web.room.wb.WbPanel.WB_JS_REFERENCE; +import static org.apache.wicket.util.time.Duration.NONE; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.Calendar; import java.util.List; import java.util.Map.Entry; @@ -74,6 +78,7 @@ import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation; import org.apache.wicket.core.request.handler.IPartialPageRequestHandler; import org.apache.wicket.event.IEvent; +import org.apache.wicket.extensions.ajax.AjaxDownload; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; @@ -81,6 +86,10 @@ import org.apache.wicket.markup.head.PriorityHeaderItem; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload; import org.apache.wicket.request.resource.JavaScriptResourceReference; +import org.apache.wicket.request.resource.ResourceStreamResource; +import org.apache.wicket.util.resource.AbstractResourceStream; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.resource.ResourceStreamNotFoundException; import org.apache.wicket.util.string.Strings; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; @@ -149,6 +158,44 @@ public class RoomPanel extends BasePanel { private final WbPanel wb; private String sharingUser = null; private String recordingUser = null; + private byte[] pdfWb; + private final AjaxDownload download = new AjaxDownload(new ResourceStreamResource() { + private static final long serialVersionUID = 1L; + + { + setCacheDuration(NONE); + setFileName("whiteboard.pdf"); + } + + @Override + protected IResourceStream getResourceStream(Attributes attributes) { + return new AbstractResourceStream() { + private static final long serialVersionUID = 1L; + + @Override + public InputStream getInputStream() throws ResourceStreamNotFoundException { + return new ByteArrayInputStream(pdfWb); + } + + @Override + public void close() throws IOException { + } + }; + } + }) { + private static final long serialVersionUID = 1L; + + @Override + protected void onDownloadCompleted(AjaxRequestTarget target) { + super.onDownloadCompleted(target); + pdfWb = null; + } + }; + + public void startDownload(AjaxRequestTarget target, byte[] bb) { + pdfWb = bb; + download.initiate(target); + } public RoomPanel(String id, Room r) { super(id); @@ -306,6 +353,7 @@ public class RoomPanel extends BasePanel { } if (room.isVisible()) { add(new NicknameDialog("nickname", this)); + add(download); } else { add(new WebMarkupContainer("nickname").setVisible(false)); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e6e1e83d/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java index 5792d78..99927b7 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java @@ -18,9 +18,9 @@ */ package org.apache.openmeetings.web.room.menu; +import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_JPG; import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF; -import static org.apache.openmeetings.util.OmFileHelper.JPG_MIME_TYPE; -import static org.apache.openmeetings.util.OmFileHelper.PNG_MIME_TYPE; +import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PNG; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_APPLICATION_BASE_URL; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY; import static org.apache.openmeetings.web.app.Application.exitRoom; @@ -273,7 +273,7 @@ public class RoomMenuPanel extends Panel { @Override public void onClick(AjaxRequestTarget target) { - target.appendJavaScript(String.format("WbArea.download('%s');", PNG_MIME_TYPE)); + target.appendJavaScript(String.format("WbArea.download('%s');", EXTENSION_PNG)); } }); actionsMenu.getItems().add(new RoomMenuItem(Application.getString("download.jpg"), Application.getString("download.jpg")) { @@ -281,7 +281,7 @@ public class RoomMenuPanel extends Panel { @Override public void onClick(AjaxRequestTarget target) { - target.appendJavaScript(String.format("WbArea.download('%s');", JPG_MIME_TYPE)); + target.appendJavaScript(String.format("WbArea.download('%s');", EXTENSION_JPG)); } }); actionsMenu.getItems().add(new RoomMenuItem(Application.getString("download.pdf"), Application.getString("download.pdf")) { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e6e1e83d/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java index ff3ab9a..cc2bed7 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java @@ -32,6 +32,7 @@ import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -143,23 +144,27 @@ public class WbPanel extends Panel { boolean moder = c.hasRight(Room.Right.moderator); Room r = rp.getRoom(); if ((moder && !r.isHidden(RoomElement.ActionMenu)) || (!moder && r.isAllowUserQuestions())) { - PDDocument doc = new PDDocument(); - JSONArray arr = obj.getJSONArray("slides"); - for (int i = 0; i < arr.length(); ++i) { - String base64Image = arr.getString(i).split(",")[1]; - byte[] bb = Base64.decodeBase64(base64Image); - BufferedImage img = ImageIO.read(new ByteArrayInputStream(bb)); - float width = img.getWidth(); - float height = img.getHeight(); - PDPage page = new PDPage(new PDRectangle(width, height)); - PDImageXObject pdImageXObject = LosslessFactory.createFromImage(doc, img); - try (PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, false)) { - contentStream.drawImage(pdImageXObject, 0, 0, width, height); + try (PDDocument doc = new PDDocument()) { + JSONArray arr = obj.getJSONArray("slides"); + for (int i = 0; i < arr.length(); ++i) { + String base64Image = arr.getString(i).split(",")[1]; + byte[] bb = Base64.decodeBase64(base64Image); + BufferedImage img = ImageIO.read(new ByteArrayInputStream(bb)); + float width = img.getWidth(); + float height = img.getHeight(); + PDPage page = new PDPage(new PDRectangle(width, height)); + PDImageXObject pdImageXObject = LosslessFactory.createFromImage(doc, img); + try (PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, false)) { + contentStream.drawImage(pdImageXObject, 0, 0, width, height); + } + doc.addPage(page); } - doc.addPage(page); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + doc.save(baos); + rp.startDownload(target, baos.toByteArray()); } - //TODO check object } + return; } //presenter-right if (c.hasRight(Right.presenter)) { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e6e1e83d/openmeetings-web/src/main/webapp/css/wb.css ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/css/wb.css b/openmeetings-web/src/main/webapp/css/wb.css index c53ca00..c594352 100644 --- a/openmeetings-web/src/main/webapp/css/wb.css +++ b/openmeetings-web/src/main/webapp/css/wb.css @@ -246,7 +246,7 @@ padding: 1px 10px; border-radius: 2px; position: absolute; - z-index: 1000; + cursor: default; } .wb-area .wb-zoom, .wb-area .wb-zoom .btn-group button { background-color: grey;