/* * Converts office documents into other formats like PDF or HTML * * ## Usage: * * var officeConverter = sol.create("sol.common.as.functions.OfficeConverter", { * openFromRepo: { * objId: "3630" * }, * saveToRepo: { * format: "pdf", * parentId: "ARCPATH:/Test", * name: "Excel1" } * }); * * @author MV, ELO Digital Office GmbH * @version 1.0 * * @eloas * @requires sol.common.RepoUtils * @requires sol.common.XmlUtils */ sol.define("sol.common.as.functions.OfficeConverter", { extend: "sol.common.as.FunctionBase", /** * @private * @property {Array} docClassNames * Supported extensions and the appropriate class name */ docClassNames: { doc: "sol.common.as.WordDocument", docx: "sol.common.as.WordDocument", rtf: "sol.common.as.WordDocument", odt: "sol.common.as.WordDocument", xls: "sol.common.as.ExcelDocument", xlsx: "sol.common.as.ExcelDocument", xlsm: "sol.common.as.ExcelDocument", xltx: "sol.common.as.ExcelDocument", xltm: "sol.common.as.ExcelDocument", csv: "sol.common.as.ExcelDocument", ods: "sol.common.as.ExcelDocument", ppt: "sol.common.as.PowerPointDocument", pot: "sol.common.as.PowerPointDocument", pps: "sol.common.as.PowerPointDocument", pptx: "sol.common.as.PowerPointDocument", potx: "sol.common.as.PowerPointDocument", pptm: "sol.common.as.PowerPointDocument", odp: "sol.common.as.PowerPointDocument", msg: "sol.common.as.MapiMessage", vsd: "sol.common.as.VisioDocument", vss: "sol.common.as.VisioDocument", vst: "sol.common.as.VisioDocument", vsx: "sol.common.as.VisioDocument", vdw: "sol.common.as.VisioDocument", vdx: "sol.common.as.VisioDocument", vsdx: "sol.common.as.VisioDocument" }, initialize: function (config) { var me = this; me.$super("sol.common.as.FunctionBase", "initialize", [config]); }, process: function () { var me = this, extension, sord, docClassName, document, objId; if (me.objId) { me.openFromRepo = { objId: me.objId }; } if (!me.objId && !me.openFile && !me.openFromRepo) { throw "'objId', openFile' or 'openFromRepo' must be set."; } extension = ""; if (me.openFromRepo) { if (!me.openFromRepo.objId) { throw "'openFromRepo.objId' must be set."; } sord = ixConnect.ix().checkoutSord(me.openFromRepo.objId, EditInfoC.mbSord, LockC.NO).sord; extension = sord.docVersion.ext.toLowerCase(); me.openFromRepo.extension = extension; } if (me.openFile) { if (me.openFile.filePath) { me.openFile.file = new java.io.File(me.openFile.filePath); } extension = Packages.org.apache.commons.io.FilenameUtils.getExtension(me.openFile.filePath); } docClassName = me.docClassNames[extension]; if (!docClassName) { me.logger.warn(["Extension '{0}' is unsupported.", extension]); return; } document = sol.create(docClassName); if (me.openFromRepo) { if (me.language && !me.openFromRepo.language) { me.openFromRepo.language = me.language; } document.openFromRepo(me.openFromRepo); } else { document.openFile(me.openFile); } if (me.hyphDicts) { document.hyphDicts = me.hyphDicts; } if (me.objId && !me.saveToRepo && !me.saveToFile && !me.saveToStream) { me.saveToRepo = { objId: me.objId, tryUpdate: true }; } if (me.saveToRepo) { if (!me.saveToRepo.format) { me.saveToRepo.format = "pdf"; } objId = document.saveToRepo(me.saveToRepo); } else if (me.saveToFile) { if (!me.saveToFile.format) { me.saveToFile.format = Packages.org.apache.commons.io.FilenameUtils.getExtension(me.saveToFile.filePath); } document.saveFile(me.saveToFile); } else if (me.saveToStream) { return document.saveToStream(me.saveToStream); } return { passOn: true, objId: objId }; }, /** * @private * Checks whether the extension is supported by the converter. * @param {String} extension Extension of the source document. * @return {Boolean} True if the extension is supported */ isSupported: function (extension) { var me = this, docClassName; if (!extension) { return false; } docClassName = me.docClassNames[extension]; return !!docClassName; } }); /* * Represents an Microsoft Office document. * * This is a base class that provides core functionality of handling office documents. Please refer to child class * implementations for more details. * * @author MV, ELO Digital Office GmbH * @version 1.0 */ sol.define("sol.common.as.OfficeDocument", { /** * @private * Opens a source file. * * officeDocument.openFile({ "file": "d:/temp/file1.docx" }); * * @param {Object} openFileConfig */ openFile: function (openFileConfig) { var me = this, inputStream; inputStream = java.io.FileInputStream(openFileConfig.file); me.open(inputStream); inputStream.close(); }, /** * @private * Opens a document from the repository. * * officeDocument.openFromRepo({ objId: "ARCPATH:/Folder1/Document1" }); * * @param {Object} openFromRepoConfig */ openFromRepo: function (openFromRepoConfig) { var me = this, inputStream; inputStream = sol.common.RepoUtils.downloadToStream(openFromRepoConfig.objId); me.objId = openFromRepoConfig.objId; me.language = openFromRepoConfig.language; me.openExtension = openFromRepoConfig.extension; me.openSeparator = openFromRepoConfig.separator; me.open(inputStream); inputStream.close(); }, /** * @private * Checks whether the destination format is supported. * * var result = officeDocument.checkFormat({ "format": "pdf" }); * * @param {Object} saveConfig * @throws {UnsupportedException} */ checkFormat: function (saveConfig) { var me = this, format; format = saveConfig.format; if (!me.saveFormats[format]) { throw "Save format '" + format + "' is unsupported"; } }, /** * @private * @param {Object} saveConfig * @returns {Function} */ getSaveParams: function (saveConfig) { var me = this, format, func; format = saveConfig.format.toUpperCase(); func = me["getSaveParams" + format]; if (func) { return func.call(me, saveConfig); } return null; }, /** * @private * Saves the converted document to a file. * * officeDocument.saveFile({ format: "pdf", filePath: "c:\\Temp\\Document1.pdf" }); * * @param {Object} saveFileConfig */ saveFile: function (saveFileConfig) { var me = this, saveParams, outputStream; me.checkFormat(saveFileConfig); saveParams = me.getSaveParams(saveFileConfig); outputStream = new FileOutputStream(saveFileConfig.filePath); me.save(outputStream, saveParams); outputStream.close(); }, /** * @private * Saves the converted document into the repository. * * officeDocument.getSaveParams({ format: "pdf", parentId: "ARCPATH:/Folder1" }); * * @param {Object} saveToRepoConfig * @return {String} Object ID */ saveToRepo: function (saveToRepoConfig) { var me = this, saveParams, outputStream; me.checkFormat(saveToRepoConfig); saveParams = me.getSaveParams(saveToRepoConfig); outputStream = new ByteArrayOutputStream(); me.save(outputStream, saveParams); saveToRepoConfig.outputStream = outputStream; saveToRepoConfig.extension = saveToRepoConfig.format; return sol.common.RepoUtils.saveToRepo(saveToRepoConfig) + ""; }, /** * @private * Writes the converted document into a string. e.g. a CSV content. * * officeDocument.saveAsString({ format: "pdf" }); * * @param {Object} saveConfig * @return {String} Content */ saveAsString: function (saveConfig) { var me = this, saveParams, outputStream, content; me.checkFormat(saveConfig); saveParams = me.getSaveParams(saveConfig); outputStream = new ByteArrayOutputStream(); me.save(outputStream, saveParams); content = String(new java.lang.String(outputStream.toByteArray(), "UTF-8")); outputStream.close(); return content; }, /** * @private * Writes the converted document into a stream. * * officeDocument.saveToStream({ format: "pdf" }); * * @param {Object} saveConfig * @return {java.io.InputStream} Input stream * */ saveToStream: function (saveConfig) { var me = this, saveParams, outputStream, inputStream; me.checkFormat(saveConfig); saveParams = me.getSaveParams(saveConfig); outputStream = new ByteArrayOutputStream(); me.save(outputStream, saveParams); inputStream = new ByteArrayInputStream(outputStream.toByteArray()); return inputStream; } }); /* * Represents a Word document. * * ## Usage * * Following example shows how to open a document from the ELO Repository and converts it to a pdf document. * * var wordDocument = sol.create("sol.common.as.WordDocument", {}); * * wordDocument.openFromRepo({ * objId: "123" * }); * * wordDocument.mailMerge(report.getData(), report.getDataDefinition()); * * wordDocument.hyphDicts = { "de-DE": "C:/ELOprofessional/data/as-Demo/dict/hyph_de_DE.dic" }; * * var newObjId = wordDocument.saveToRepo({ * format: "pdf", * parentId: "ARCPATH:/Test", * name: "Report1" * }); * * @author MV, ELO Digital Office GmbH * @version 1.0 * * @eloas */ sol.define("sol.common.as.WordDocument", { extend: "sol.common.as.OfficeDocument", /** * @private * @cfg {Object} * Supported destination formats */ saveFormats: { pdf: {}, html: {}, docx: {} }, initialize: function (config) { var me = this; me.$super("sol.Base", "initialize", [config]); me.logger.debug(["Aspose.Words: product={0}, version={1}", Packages.com.aspose.words.BuildVersionInfo.product, Packages.com.aspose.words.BuildVersionInfo.version]); }, /** * @private * @param {java.io.InputStream} inputStream */ open: function (inputStream) { var me = this; me.document = new Packages.com.aspose.words.Document(inputStream); }, /** * @private * Renders a template word document with placeholders. * The placeholders must be defined in 'mustache' syntax. * @param {Object} data JavaScript object that contains the data to fill-in * @param {Object} dataDefinition Data definition to resolve JavaScript arrays to XML tags */ mailMerge: function (data, dataDefinition) { var me = this, mailMerge, xmlDoc = sol.common.XmlUtils.convertObjectToXml(data, dataDefinition); mailMerge = me.document.mailMerge; mailMerge.useNonMergeFields = true; mailMerge.cleanupOptions = Packages.com.aspose.words.MailMergeCleanupOptions.REMOVE_UNUSED_FIELDS; me.logger.debug("xml=" + sol.common.XmlUtils.toString(xmlDoc)); mailMerge.executeWithRegions(new Packages.de.elo.mover.main.aspose.XmlMailMergeDataSet(xmlDoc)); }, /** * @private * Renders a template word document with content controls. * The placeholders must be defined in 'mustache' syntax. * @param {Object} data JavaScript object that contains the data to fill-in * * The tag of the content control must contain a Handlesbars string which determinates what should be filled in. * e.g. {{{CONTRACT.objKeys.PARTNER_NAME}}} */ fillContentControls: function (data) { var me = this, value = "", controlIterator, control, tag, paragraph, run; controlIterator = me.document.getChildNodes(Packages.com.aspose.words.NodeType.STRUCTURED_DOCUMENT_TAG, true).iterator(); me.logger.debug("Fill content controls: objId=" + me.objId); me.logger.debug("Library: " + Packages.com.aspose.words.BuildVersionInfo.product + ": " + Packages.com.aspose.words.BuildVersionInfo.version); while (controlIterator.hasNext()) { control = controlIterator.next(); if (control.sdtType != Packages.com.aspose.words.SdtType.PLAIN_TEXT) { me.logger.debug("Word content control not supported: title=" + control.title + ", sdtType=" + control.sdtType + ", tag=" + control.tag + ", value=" + value); continue; } tag = String(control.tag); if (tag.indexOf("{{") < 0) { return; } value = sol.create("sol.common.Template", { source: tag }).apply(data); me.logger.debug("Fill word content control: title=" + control.title + ", sdtType=" + control.sdtType + ", level=" + control.level + ", tag=" + control.tag + ", value=" + value); run = new Packages.com.aspose.words.Run(me.document, value); me.copyProperties(control.parentNode.paragraphBreakFont, run.font); switch (control.level) { case Packages.com.aspose.words.MarkupLevel.INLINE: control.removeAllChildren(); control.appendChild(run); break; case Packages.com.aspose.words.MarkupLevel.BLOCK: paragraph = control.childNodes.get(0); paragraph = new Packages.com.aspose.words.Paragraph(me.document); control.removeAllChildren(); paragraph.appendChild(run); control.appendChild(paragraph); break; default: throw "Unsupported markup level"; } } }, /** * @private * Copies properties of Java objects * @param {java.lang.Object} srcObj * @param {java.lang.Object} dstObj */ copyProperties: function (srcObj, dstObj) { var getterName, value; if (!srcObj.getClass) { throw "Source object must be a Java object"; } if (!dstObj.getClass) { throw "Destination object must be a Java object"; } if (srcObj.getClass().name != dstObj.getClass().name) { throw "Source and destination object must be of the same type"; } dstObj.getClass().methods.forEach(function (method) { if ((method.name.indexOf("set") == 0) && (method.genericParameterTypes.length == 1)) { getterName = "get" + method.name.substring(3); value = srcObj[getterName](); dstObj[method.name](value); } }); }, /** * @private * @return {com.aspose.words.SaveOptions} */ getSaveParamsPDF: function () { return Packages.com.aspose.words.SaveOptions.createSaveOptions(Packages.com.aspose.words.SaveFormat.PDF); }, /** * @private * @return {com.aspose.words.SaveOptions} */ getSaveParamsDOCX: function () { return Packages.com.aspose.words.SaveOptions.createSaveOptions(Packages.com.aspose.words.SaveFormat.DOCX); }, /** * @private * @return {com.aspose.words.SaveOptions} */ getSaveParamsHTML: function () { return Packages.com.aspose.words.SaveOptions.createSaveOptions(Packages.com.aspose.words.SaveFormat.HTML); }, /** * @private * @param {java.io.OutputStream} outputStream * @param {com.aspose.words.SaveOptions} saveParams */ save: function (outputStream, saveParams) { var me = this, languageString, dictFilePath; if (me.hyphDicts) { for (languageString in me.hyphDicts) { dictFilePath = me.hyphDicts[languageString]; me.logger.debug(["Set hypen dictionary: lang={0}, dictFilePath={1}", languageString, dictFilePath]); Packages.com.aspose.words.Hyphenation.registerDictionary(languageString, dictFilePath); } } me.document.save(outputStream, saveParams); } }); /* * Represents an Excel document. * * ## Usage * * Following example shows how to open a document from the ELO repository and converts it to a pdf document. * * var excelDocument = sol.create("sol.common.as.ExcelDocument", {}); * * excelDocument.openFromRepo({ * objId: "123" * separator: "#" * }); * * var newObjId = excelDocument.saveToRepo({ * format: "pdf", * parentId: "ARCPATH:/Test", * name: "ExcelDocument1" * }); * * @author MV, ELO Digital Office GmbH * @version 1.0 * * @eloas */ sol.define("sol.common.as.ExcelDocument", { extend: "sol.common.as.OfficeDocument", /** * @private * @cfg {Array} * Supported destination formats */ saveFormats: { csv: {}, pdf: {}, html: {}, xlsx: {} }, /** * @private */ regions: { at: Packages.com.aspose.cells.CountryCode.AUSTRIA, be: Packages.com.aspose.cells.CountryCode.BELGIUM, ch: Packages.com.aspose.cells.CountryCode.SWITZERLAND, cz: Packages.com.aspose.cells.CountryCode.CZECH, de: Packages.com.aspose.cells.CountryCode.GERMANY, dk: Packages.com.aspose.cells.CountryCode.DENMARK, en: Packages.com.aspose.cells.CountryCode.USA, fi: Packages.com.aspose.cells.CountryCode.FINLAND, fr: Packages.com.aspose.cells.CountryCode.FRANCE, hu: Packages.com.aspose.cells.CountryCode.HUNGARY, it: Packages.com.aspose.cells.CountryCode.ITALY, nl: Packages.com.aspose.cells.CountryCode.NETHERLANDS, pl: Packages.com.aspose.cells.CountryCode.POLAND, pt: Packages.com.aspose.cells.CountryCode.PORTUGAL, sp: Packages.com.aspose.cells.CountryCode.SPAIN, tr: Packages.com.aspose.cells.CountryCode.TURKEY }, initialize: function (config) { var me = this; me.$super("sol.Base", "initialize", [config]); me.lineSeparator = java.lang.System.lineSeparator(); }, /** * @private * @param {java.io.InputStream} inputStream */ open: function (inputStream) { var me = this, loadOptions, region; loadOptions = new Packages.com.aspose.cells.LoadOptions(); if (me.openExtension && (me.openExtension.toLowerCase() == "csv")) { loadOptions = new Packages.com.aspose.cells.TxtLoadOptions(Packages.com.aspose.cells.FileFormatType.CSV); loadOptions.separatorString = me.openSeparator || ";"; } me.workbook = new Packages.com.aspose.cells.Workbook(inputStream, loadOptions); if (me.language) { me.logger.debug(["Open workbook: language={0}, aspose.region={1}", me.language, region]); region = me.regions[me.language]; me.workbook.settings.region = region; } }, /** * @private * @return {Packages.com.aspose.cells.TxtSaveOptions} */ getSaveParamsCSV: function () { var txtSaveOptions = new Packages.com.aspose.cells.TxtSaveOptions(); txtSaveOptions.separator = ";"; return txtSaveOptions; }, /** * @private * @return {com.aspose.cells.PdfSaveOptions} */ getSaveParamsPDF: function () { return new Packages.com.aspose.cells.PdfSaveOptions(); }, /** * @private * @return {com.aspose.cells.HtmlSaveOptions} */ getSaveParamsHTML: function () { return new Packages.com.aspose.cells.HtmlSaveOptions(); }, /** * @private * @return {Number} */ getSaveParamsXLSX: function () { return Packages.com.aspose.cells.SaveFormat.XLSX; }, /** * @private * @param {java.io.OutputStream} outputStream * @param {com.aspose.cells.SaveOptions|Number} saveParams */ save: function (outputStream, saveParams) { var me = this; me.workbook.save(outputStream, saveParams); } }); /* * Represents a PowerPoint document. * * ## Usage * * Following example shows how to open a document from the ELO Repository and converts it to a pdf document. * * var powerPointDocument = sol.create("sol.common.as.PowerPointDocument", {}); * powerPointDocument.openFromRepo({ * objId: "123" * }); * * var newObjId = powerPointDocument.saveToRepo({ * format: "pdf", * parentId: "ARCPATH:/Test", * name: "PowerPointDocument1" * }); * * @author MV, ELO Digital Office GmbH * @version 1.0 * * @eloas */ sol.define("sol.common.as.PowerPointDocument", { extend: "sol.common.as.OfficeDocument", /** * @cfg {Object} * Supported destination formats */ saveFormats: { pdf: {}, html: {} }, initialize: function (config) { var me = this; me.$super("sol.Base", "initialize", [config]); }, /** * @private * @param {java.io.InputStream} inputStream */ open: function (inputStream) { var me = this; me.presentation = new Packages.com.aspose.slides.Presentation(inputStream); }, /** * @private * @return {Number} */ getSaveParamsPDF: function () { return Packages.com.aspose.slides.SaveFormat.Pdf; }, /** * @private * @return {Number} */ getSaveParamsHTML: function () { return Packages.com.aspose.slides.SaveFormat.Html; }, /** * @private * @param {java.io.OutputStream} outputStream * @param {Number} saveParams */ save: function (outputStream, saveParams) { var me = this; me.presentation.save(outputStream, saveParams); } }); /* * Represents an Outlook message (MSG). * * ## Usage * * Following example shows how to open an email from the ELO Repository and converts it to a pdf document. * * var mapiMessage = sol.create("sol.common.as.MapiMessage", {}); * * mapiMessage.openFromRepo({ * objId: "123" * }); * * var newObjId = mapiMessage.saveToRepo({ * format: "pdf", * parentId: "ARCPATH:/Test", * name: "MapiMessage1" * }); * * @author MV, ELO Digital Office GmbH * @version 1.0 * * @eloas */ sol.define("sol.common.as.MapiMessage", { extend: "sol.common.as.OfficeDocument", /** * @private * @cfg {Object} * Supported destination formats */ saveFormats: { pdf: {} }, initialize: function (config) { var me = this; me.$super("sol.Base", "initialize", [config]); }, /** * @private * @param {java.io.InputStream} inputStream */ open: function (inputStream) { var me = this; me.mailMessage = new Packages.com.aspose.email.MailMessage.load(inputStream); }, /** * @private * @return {String} */ getSaveParamsPDF: function () { return "PDF"; }, /** * @private * @param {java.io.OutputStream} outputStream * @param {String} saveParams */ save: function (outputStream, saveParams) { var me = this; if (saveParams == "PDF") { me.savePDF(outputStream); } }, /** * @private * @param {java.io.OutputStream} outputStream */ savePDF: function (outputStream) { var me = this, mhtmlOutputStream, loadOptions, mhtmlInputStream, wordDocument; mhtmlOutputStream = new ByteArrayOutputStream(); me.mailMessage.save(mhtmlOutputStream, Packages.com.aspose.email.MailMessageSaveType.getMHtmlFormat()); mhtmlOutputStream.close(); loadOptions = new Packages.com.aspose.words.LoadOptions(); loadOptions.loadFormat = Packages.com.aspose.words.LoadFormat.MHTML; mhtmlInputStream = new ByteArrayInputStream(mhtmlOutputStream.toByteArray()); wordDocument = new Packages.com.aspose.words.Document(mhtmlInputStream, loadOptions); mhtmlInputStream.close(); wordDocument.save(outputStream, Packages.com.aspose.words.SaveFormat.PDF); } }); /* * Represents a Visio document. * * ## Usage * * Following example shows how to open a document from the ELO repository and converts it to a pdf document. * * var visioDocument = sol.create("sol.common.as.VisioDocument", {}); * * visioDocument.openFromRepo({ * objId: "123" * }); * * var newObjId = visioDocument.saveToRepo({ * format: "pdf", * parentId: "ARCPATH:/Test", * name: "VisioDocument1" * }); * * @author MV, ELO Digital Office GmbH * @version 1.0 * * @eloas * */ sol.define("sol.common.as.VisioDocument", { extend: "sol.common.as.OfficeDocument", /** * @private * @cfg {Object} * Supported destination formats */ saveFormats: { pdf: {} }, initialize: function (config) { var me = this; me.$super("sol.Base", "initialize", [config]); }, /** * @private * @param {java.io.InputStream} inputStream */ open: function (inputStream) { var me = this; me.diagram = new Packages.com.aspose.diagram.Diagram(inputStream); }, /** * @private * @return {com.aspose.diagram.DiagramSaveOptions} */ getSaveParamsPDF: function () { return Packages.com.aspose.diagram.SaveFileFormat.PDF; }, /** * @private * @param {java.io.OutputStream} outputStream * @param {com.aspose.diagram.DiagramSaveOptions} saveParams */ save: function (outputStream, saveParams) { var me = this; me.diagram.save(outputStream, saveParams); } });