Repository: openmeetings Updated Branches: refs/heads/master f273d8c4c -> fbe9e48f3
[OPENMEETINGS-427] initial commit Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/fbe9e48f Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/fbe9e48f Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/fbe9e48f Branch: refs/heads/master Commit: fbe9e48f34a78eecc9a3e1a174bbf4497e6fb01b Parents: f273d8c Author: Maxim Solodovnik <solomax...@gmail.com> Authored: Thu Aug 10 19:54:33 2017 +0700 Committer: Maxim Solodovnik <solomax...@gmail.com> Committed: Thu Aug 10 19:54:33 2017 +0700 ---------------------------------------------------------------------- openmeetings-web/pom.xml | 12 +++++++ .../web/room/menu/RoomMenuPanel.java | 17 ++++++++-- .../openmeetings/web/room/wb/WbAction.java | 1 + .../openmeetings/web/room/wb/WbPanel.java | 35 ++++++++++++++++++++ .../org/apache/openmeetings/web/room/wb/wb.js | 27 +++++++++++---- 5 files changed, 83 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/openmeetings/blob/fbe9e48f/openmeetings-web/pom.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml index c087139..feedeb9 100644 --- a/openmeetings-web/pom.xml +++ b/openmeetings-web/pom.xml @@ -33,6 +33,7 @@ <mysql.version>5.1.43</mysql.version> <old-backups.dir>${project.build.directory}/test-data</old-backups.dir> <site.basedir>${project.parent.basedir}</site.basedir> + <pdfbox.version>2.0.6</pdfbox.version> </properties> <profiles> <profile> @@ -603,5 +604,16 @@ <version>${derby.version}</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.pdfbox</groupId> + <artifactId>pdfbox</artifactId> + <version>${pdfbox.version}</version> + <exclusions> + <exclusion> + <groupId>org.apache.pdfbox</groupId> + <artifactId>pdfbox-tools</artifactId> + </exclusion> + </exclusions> + </dependency> </dependencies> </project> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/fbe9e48f/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 5a37991..5792d78 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,6 +18,9 @@ */ package org.apache.openmeetings.web.room.menu; +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.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; @@ -270,7 +273,7 @@ public class RoomMenuPanel extends Panel { @Override public void onClick(AjaxRequestTarget target) { - target.appendJavaScript("WbArea.download('png');"); + target.appendJavaScript(String.format("WbArea.download('%s');", PNG_MIME_TYPE)); } }); actionsMenu.getItems().add(new RoomMenuItem(Application.getString("download.jpg"), Application.getString("download.jpg")) { @@ -278,7 +281,15 @@ public class RoomMenuPanel extends Panel { @Override public void onClick(AjaxRequestTarget target) { - target.appendJavaScript("WbArea.download('jpeg');"); + target.appendJavaScript(String.format("WbArea.download('%s');", JPG_MIME_TYPE)); + } + }); + actionsMenu.getItems().add(new RoomMenuItem(Application.getString("download.pdf"), Application.getString("download.pdf")) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + target.appendJavaScript(String.format("WbArea.download('%s');", EXTENSION_PDF)); } }); //TODO seems need to be removed actionsMenu.getItems().add(new RoomMenuItem(Application.getString(1126), Application.getString(1490))); @@ -298,7 +309,7 @@ public class RoomMenuPanel extends Panel { exitMenuItem.setEnabled(notExternalUser);//TODO check this filesMenu.setEnabled(room.getSidebar().isShowFiles()); boolean moder = room.getClient().hasRight(Room.Right.moderator); - actionsMenu.setEnabled((moder &&!r.isHidden(RoomElement.ActionMenu)) || (!moder && r.isAllowUserQuestions())); + actionsMenu.setEnabled((moder && !r.isHidden(RoomElement.ActionMenu)) || (!moder && r.isAllowUserQuestions())); inviteMenuItem.setEnabled(notExternalUser && moder); //TODO add check "sharing started" boolean shareVisible = room.screenShareAllowed(); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/fbe9e48f/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbAction.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbAction.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbAction.java index 6838064..5ef5bfd 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbAction.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbAction.java @@ -32,4 +32,5 @@ public enum WbAction { , load , undo , setSize + , downloadPdf } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/fbe9e48f/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 2c32d81..ff3ab9a 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 @@ -28,8 +28,10 @@ import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFu import static org.apache.wicket.AttributeModifier.append; import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit; +import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -43,6 +45,9 @@ import java.util.UUID; import java.util.function.Consumer; import java.util.function.Function; +import javax.imageio.ImageIO; + +import org.apache.commons.codec.binary.Base64; import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache; import org.apache.openmeetings.db.dao.file.FileExplorerItemDao; import org.apache.openmeetings.db.dao.record.RecordingDao; @@ -53,6 +58,7 @@ import org.apache.openmeetings.db.entity.basic.Client; import org.apache.openmeetings.db.entity.file.FileExplorerItem; import org.apache.openmeetings.db.entity.file.FileItem; import org.apache.openmeetings.db.entity.file.FileItem.Type; +import org.apache.openmeetings.db.entity.room.Room; import org.apache.openmeetings.db.entity.room.Room.Right; import org.apache.openmeetings.db.entity.room.Room.RoomElement; import org.apache.openmeetings.util.NullStringer; @@ -60,6 +66,13 @@ import org.apache.openmeetings.util.OmFileHelper; import org.apache.openmeetings.web.app.Application; import org.apache.openmeetings.web.common.NameDialog; import org.apache.openmeetings.web.room.RoomPanel; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; +import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.attributes.AjaxRequestAttributes; @@ -126,6 +139,28 @@ public class WbPanel extends Panel { } Client c = rp.getClient(); + if (WbAction.downloadPdf == a) { + 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); + } + doc.addPage(page); + } + //TODO check object + } + } //presenter-right if (c.hasRight(Right.presenter)) { switch (a) { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/fbe9e48f/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js index 9d49383..61789f8 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js @@ -1458,13 +1458,28 @@ var WbArea = (function() { if (!_inited) return; self.getWb(json.wbId).setSize(json); } + function _getImage(cnv, fmt) { + //TODO zoom ??? + return cnv.toDataURL({format: fmt, width: cnv.width, height: cnv.height, left: 0, top: 0}); + } self.download = function(fmt) { - var wb = getActive().data(), cnv = wb.getCanvas() - , a = document.createElement('a'); - a.setAttribute('target', '_blank') - a.setAttribute('download', wb.name + '.' + fmt); - a.setAttribute('href', cnv.toDataURL({format: fmt, width: cnv.width, height: cnv.height, left: 0, top: 0})); //TODO zoom - a.dispatchEvent(new MouseEvent('click', {view: window, bubbles: false, cancelable: true})); + var wb = getActive().data(); + if ('pdf' === fmt) { + var arr = []; + wb.eachCanvas(function(cnv) { + arr.push(_getImage(cnv, 'image/png')); + }); + wbAction('downloadPdf', JSON.stringify({ + slides: arr + })); + } else { + var cnv = wb.getCanvas() + , a = document.createElement('a'); + a.setAttribute('target', '_blank') + a.setAttribute('download', wb.name + '.' + fmt); + a.setAttribute('href', _getImage(cnv, fmt)); + a.dispatchEvent(new MouseEvent('click', {view: window, bubbles: false, cancelable: true})); + } } return self; })();