Learn how to convert an office file and an image to other formats and sizes.
Converting an Office File into a PDF File
Goal
Convert a file from an office format into PDF format.
Prerequisites
- Create users on your Nuxeo instance. See Setting up Your JavaScript Environment.
-
Create the
AwesomeTech-Contract
contract and its attachments. See Managing Files.
Procedure
Create a file called
downloadPDFRendition.js
with the following content. Be sure to replace thefilePath
variable with the path to the folder where the PDF rendition should be downloaded.#!/usr/bin/env node // fs and path NodeJS modules are required to handle file download let fs = require('fs'); let path = require('path'); let Nuxeo = require('nuxeo'); let nuxeo = new Nuxeo({ auth: { method: 'basic', username: 'sconnor', password: 'sconnor' } }); // Change this value to indicate in which folder the PDF rendition file should be downloaded // Don't forget the trailing slash let filePath = '/tmp/'; // Which contract to fetch a rendition for - No need to change if you followed our instructions so far let contractToFetch = '/default-domain/workspaces/North America/awesome-tech/awesome-contract'; // Further calls will return all document properties nuxeo.schemas('*'); // First we'll display the renditions list // to give you an idea of what you could fetch out of the box nuxeo.repository().fetch(contractToFetch) .then(contract => { return contract.fetchRenditions(); }) .then(renditions => { console.log('\nThe following renditions can be called on the contract:\n'); console.log(renditions); console.log('\nWe\'ll ask for a PDF rendition.\n'); }) .catch(error => { console.log('Apologies, an error occurred while fetching the renditions list.'); console.log(error); return; }); nuxeo.repository().fetch(contractToFetch) .then(contract => { return contract.fetchRendition('pdf'); }) .then(response => { // Download the rendition and store it on the disk try { let stats = fs.statSync(filePath); if (!stats.isDirectory()) { console.log(filePath + ' is not a folder.\nPlease check the filePath variable (currently set to: ' + filePath + ')\nand make sure you have the proper rights on that folder.'); return; } const writable = fs.createWriteStream(path.join(filePath, 'contract.pdf')); response.body.pipe(writable); console.log('The PDF rendition has been downloaded.'); console.log(`You can take a look at it here: ${path.join(filePath, 'contract.pdf')}`) } catch (error) { console.log(`The folder where the rendition should be downloaded cannot be accessed.\nPlease check the filePath variable (currently set to: ${filePath})\nand make sure you have write access on that folder.`); console.log(error); return; } return nuxeo.repository().fetch(contractToFetch); }) .then(contract => { console.log(`Notice that the contract's file remains in its initial format:`); console.log(contract.properties['file:content']); }) .catch(error => { console.log('Apologies, an error occurred while retrieving the contract.'); console.log(error); return; });
Save and run:
$ node downloadPDFRendition.js
Note: The contract's file stored on the Nuxeo server remains in its initial format. The rendition is applied on the fly so that only the downloaded file is converted.
Fetching Resized Pictures
Goal
The marketing department wants to use the companies' logos stored in the portfolios for testimonials. They need all these images to have the same dimensions. Use a rendition to cover this need.
Prerequisites
- Create users on your Nuxeo instance. See Setting up Your JavaScript Environment.
- Install the addon Getting started with the Nuxeo Platform. See Setting up Your Nuxeo Environment.
Procedure
Create a file called
downloadResizedLogo.js
with the following content. Be sure to replace thefilePath
variable with the path to the folder where the resized logo should be downloaded.#!/usr/bin/env node // fs and path NodeJS modules are required to handle file download let fs = require('fs'); let path = require('path'); let Nuxeo = require('nuxeo'); let nuxeo = new Nuxeo({ auth: { method: 'basic', username: 'sconnor', password: 'sconnor' } }); // Change this value to indicate in which folder the image rendition file should be downloaded // Don't forget the trailing slash let filePath = '/tmp/'; // Which portfolio to fetch a rendition for - No need to change if you followed our instructions so far let portfolioToFetch = '/default-domain/workspaces/North America/Money Bank'; // Size of the company logo rendition you want to obtain // You can change "Medium" to "Thumbnail", "Small" or "OriginalJpeg" to see the difference for yourself let renditionSize = 'Medium'; // Init some variables that will be used for the file name let companyName; let fileFormat; // Further calls will return all document properties nuxeo.schemas('*'); nuxeo.repository().fetch(portfolioToFetch) .then(portfolio => { // Store the company name to use it in the file name later companyName = portfolio.properties['dc:title']; // Display the different image sizes console.log('\nThe following image sizes can be downloaded:\n'); portfolio.properties['picture:views'].forEach(currentPictureView => { console.log(currentPictureView.title); console.log(currentPictureView.info); // Store the rendition format to generate the filename later if (currentPictureView.title === renditionSize) { fileFormat = currentPictureView.info.format.toLowerCase(); } }); console.log('\nWe\'ll ask for a ' + renditionSize + '-sized company logo in the ' + fileFormat + ' format.'); return portfolio.fetchRendition(renditionSize); }) .then(response => { // Download the rendition and store it on the disk try { var stats = fs.statSync(filePath); if (!stats.isDirectory()) { console.log(`${filePath} is not a folder.\nPlease check the filePath variable (currently set to: ${filePath})\nand make sure you have the proper rights on that folder.`); return; } let renditionFilePath = path.join(filePath, `${companyName}-${renditionSize}.${fileFormat}`); const writable = fs.createWriteStream(renditionFilePath); response.body.pipe(writable); console.log(`The ${renditionSize} sized company logo has been downloaded!`); console.log(`You can take a look at it here: ${renditionFilePath}`) } catch (error) { console.log('The folder where the rendition should be downloaded cannot be accessed.\nPlease check the filePath variable (currently set to: ' + filePath + ')\nand make sure you have write access on that folder.'); console.log(error); return; } }) .catch(error => { console.log('Apologies, an error occurred while fetching the rendition.'); console.log(error); return; });
Save and run:
$ node downloadResizedLogo.js
Note: The same principles can be applied on videos as well, to fetch them in various formats and quality options. Pictures and video renditions are stored in the document directly in order to boost performances.