UNPKG

chromiumly

Version:

A lightweight Typescript library that interacts with Gotenberg's different modules to convert a variety of document formats to PDF files.

324 lines 15.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.LibreOfficeUtils = void 0; const fs_1 = require("fs"); const path_1 = __importDefault(require("path")); const consumers_1 = require("node:stream/consumers"); const common_1 = require("../../common"); const constants_1 = require("./constants"); /** * Utility class for handling common tasks related to LibreOffice conversions. */ class LibreOfficeUtils { static isLibreFileInfo(file) { return (typeof file === 'object' && file !== null && 'data' in file && 'ext' in file); } static async getFileInfo(file) { if (typeof file === 'string') { await fs_1.promises.access(file, fs_1.constants.R_OK); const filename = path_1.default.basename(path_1.default.parse(file).base); return { data: file, ext: path_1.default.extname(filename).slice(1) }; } else { return { data: file.data, ext: file.ext }; } } /** * Adds files to the FormData object for LibreOffice conversion. * * @param {PathLikeOrReadStream[]} files - An array of files to be added to the FormData. * @param {FormData} data - The FormData object to which files will be added. * @throws {Error} Throws an error if the file extension is not supported. */ static async addFiles(files, data) { const paddingLength = String(files.length).length + 1; await Promise.all(files.map(async (file, index) => { const fileInfo = await this.getFileInfo(file); if (!constants_1.LIBRE_OFFICE_EXTENSIONS.includes(fileInfo.ext)) { throw new Error(`${fileInfo.ext} is not supported`); } const filename = `file${String(index + 1).padStart(paddingLength, '0')}.${fileInfo.ext}`; if (Buffer.isBuffer(fileInfo.data)) { data.append('files', new Blob([fileInfo.data]), filename); } else if (fileInfo.data instanceof fs_1.ReadStream) { const content = await (0, consumers_1.blob)(fileInfo.data); data.append('files', content, filename); } else { await fs_1.promises.access(fileInfo.data, fs_1.constants.R_OK); const content = await (0, fs_1.openAsBlob)(fileInfo.data); data.append('files', content, filename); } })); } /** * Adds page properties to the FormData object based on the provided PageProperties. * * @param {FormData} data - The FormData object to which page properties will be added. * @param {PageProperties} pageProperties - The page properties to be added to the FormData. */ static addPageProperties(data, pageProperties) { if (pageProperties.landscape) { data.append('landscape', String(pageProperties.landscape)); } if (pageProperties.nativePageRanges) { common_1.GotenbergUtils.assert(pageProperties.nativePageRanges.from > 0 && pageProperties.nativePageRanges.to > 0 && pageProperties.nativePageRanges.to >= pageProperties.nativePageRanges.from, 'page ranges syntax error'); data.append('nativePageRanges', `${pageProperties.nativePageRanges.from}-${pageProperties.nativePageRanges.to}`); } if (pageProperties.exportFormFields === false) { data.append('exportFormFields', String(pageProperties.exportFormFields)); } if (pageProperties.singlePageSheets) { data.append('singlePageSheets', String(pageProperties.singlePageSheets)); } if (pageProperties.allowDuplicateFieldNames) { data.append('allowDuplicateFieldNames', String(pageProperties.allowDuplicateFieldNames)); } if (pageProperties.exportBookmarks === false) { data.append('exportBookmarks', String(pageProperties.exportBookmarks)); } if (pageProperties.exportBookmarksToPdfDestination) { data.append('exportBookmarksToPdfDestination', String(pageProperties.exportBookmarksToPdfDestination)); } if (pageProperties.exportPlaceholders) { data.append('exportPlaceholders', String(pageProperties.exportPlaceholders)); } if (pageProperties.exportNotes) { data.append('exportNotes', String(pageProperties.exportNotes)); } if (pageProperties.exportNotesPages) { data.append('exportNotesPages', String(pageProperties.exportNotesPages)); } if (pageProperties.exportOnlyNotesPages) { data.append('exportOnlyNotesPages', String(pageProperties.exportOnlyNotesPages)); } if (pageProperties.exportNotesInMargin) { data.append('exportNotesInMargin', String(pageProperties.exportNotesInMargin)); } if (pageProperties.convertOooTargetToPdfTarget) { data.append('convertOooTargetToPdfTarget', String(pageProperties.convertOooTargetToPdfTarget)); } if (pageProperties.exportLinksRelativeFsys) { data.append('exportLinksRelativeFsys', String(pageProperties.exportLinksRelativeFsys)); } if (pageProperties.exportHiddenSlides) { data.append('exportHiddenSlides', String(pageProperties.exportHiddenSlides)); } if (pageProperties.skipEmptyPages) { data.append('skipEmptyPages', String(pageProperties.skipEmptyPages)); } if (pageProperties.addOriginalDocumentAsStream) { data.append('addOriginalDocumentAsStream', String(pageProperties.addOriginalDocumentAsStream)); } if (pageProperties.password) { data.append('password', pageProperties.password); } } /** * Adds files to the FormData object with a custom field name. * * @param {PathLikeOrReadStream[]} files - An array of files to be added to the FormData. * @param {FormData} data - The FormData object to which files will be added. * @param {string} fieldName - The field name to use when appending files (e.g., 'files', 'embeds'). * @returns {Promise<void>} A Promise that resolves once the files have been added. */ static async addFilesWithFieldName(files, data, fieldName) { await Promise.all(files.map(async (file, index) => { const fileInfo = await this.getFileInfo(file); const filename = path_1.default.basename(typeof file === 'string' ? file : `file${index + 1}`); if (Buffer.isBuffer(fileInfo.data)) { data.append(fieldName, new Blob([fileInfo.data]), filename); } else if (fileInfo.data instanceof fs_1.ReadStream) { const content = await (0, consumers_1.blob)(fileInfo.data); data.append(fieldName, content, filename); } else { await fs_1.promises.access(fileInfo.data, fs_1.constants.R_OK); const _filename = path_1.default.basename(fileInfo.data.toString()); const content = await (0, fs_1.openAsBlob)(fileInfo.data); data.append(fieldName, content, _filename); } })); } /** * Customizes the FormData object based on the provided conversion options. * * @param {FormData} data - The FormData object to be customized. * @param {ConversionOptions} options - The conversion options to apply to the FormData. * @returns {Promise<void>} A Promise that resolves once the customization is complete. */ static async customize(data, options) { if (options.pdfa) { data.append('pdfa', options.pdfa); } if (options.pdfUA) { data.append('pdfua', String(options.pdfUA)); } if (options.merge) { data.append('merge', String(options.merge)); } if (options.metadata) { data.append('metadata', JSON.stringify(options.metadata)); } if (options.losslessImageCompression) { data.append('losslessImageCompression', String(options.losslessImageCompression)); } if (options.reduceImageResolution) { data.append('reduceImageResolution', String(options.reduceImageResolution)); } if (options.quality) { common_1.GotenbergUtils.assert(options.quality >= 1 && options.quality <= 100, 'Invalid compression quality. Please provide a value between 1 and 100.'); data.append('quality', options.quality); } if (options.maxImageResolution) { common_1.GotenbergUtils.assert(options.reduceImageResolution === true, 'Compression quality is only supported when the reduceImageResolution property is enabled.'); data.append('maxImageResolution', options.maxImageResolution); } if (options.initialView !== undefined) { data.append('initialView', String(options.initialView)); } if (options.initialPage !== undefined) { data.append('initialPage', String(options.initialPage)); } if (options.magnification !== undefined) { data.append('magnification', String(options.magnification)); } if (options.zoom !== undefined) { data.append('zoom', String(options.zoom)); } if (options.pageLayout !== undefined) { data.append('pageLayout', String(options.pageLayout)); } if (options.firstPageOnLeft) { data.append('firstPageOnLeft', String(options.firstPageOnLeft)); } if (options.resizeWindowToInitialPage) { data.append('resizeWindowToInitialPage', String(options.resizeWindowToInitialPage)); } if (options.centerWindow) { data.append('centerWindow', String(options.centerWindow)); } if (options.openInFullScreenMode) { data.append('openInFullScreenMode', String(options.openInFullScreenMode)); } if (options.displayPDFDocumentTitle === false) { data.append('displayPDFDocumentTitle', String(options.displayPDFDocumentTitle)); } if (options.hideViewerMenubar) { data.append('hideViewerMenubar', String(options.hideViewerMenubar)); } if (options.hideViewerToolbar) { data.append('hideViewerToolbar', String(options.hideViewerToolbar)); } if (options.hideViewerWindowControls) { data.append('hideViewerWindowControls', String(options.hideViewerWindowControls)); } if (options.useTransitionEffects === false) { data.append('useTransitionEffects', String(options.useTransitionEffects)); } if (options.openBookmarkLevels !== undefined) { data.append('openBookmarkLevels', String(options.openBookmarkLevels)); } if (options.downloadFrom) { data.append('downloadFrom', JSON.stringify(common_1.GotenbergUtils.normalizeDownloadFrom(options.downloadFrom))); } if (options.properties) { LibreOfficeUtils.addPageProperties(data, options.properties); } if (options.split) { data.append('splitMode', options.split.mode); data.append('splitSpan', options.split.span); if (options.split.unify) { common_1.GotenbergUtils.assert(options.split.mode === 'pages', 'split unify is only supported for pages mode'); data.append('splitUnify', String(options.split.unify)); } } if (options.flatten) { data.append('flatten', String(options.flatten)); } if (options.userPassword) { data.append('userPassword', options.userPassword); } if (options.ownerPassword) { data.append('ownerPassword', options.ownerPassword); } if (options.embeds && options.embeds.length > 0) { await LibreOfficeUtils.addFilesWithFieldName(options.embeds, data, 'embeds'); } if (options.nativeWatermarkText !== undefined) { data.append('nativeWatermarkText', options.nativeWatermarkText); } if (options.nativeWatermarkColor !== undefined) { data.append('nativeWatermarkColor', String(options.nativeWatermarkColor)); } if (options.nativeWatermarkFontHeight !== undefined) { data.append('nativeWatermarkFontHeight', String(options.nativeWatermarkFontHeight)); } if (options.nativeWatermarkRotateAngle !== undefined) { data.append('nativeWatermarkRotateAngle', String(options.nativeWatermarkRotateAngle)); } if (options.nativeWatermarkFontName !== undefined) { data.append('nativeWatermarkFontName', options.nativeWatermarkFontName); } if (options.nativeTiledWatermarkText !== undefined) { data.append('nativeTiledWatermarkText', options.nativeTiledWatermarkText); } if (options.watermark || options.stamp) { const watermarkForUtils = options.watermark ? (() => { const { file, ...rest } = options.watermark; if (file === undefined) { return rest; } if (LibreOfficeUtils.isLibreFileInfo(file)) { return rest; } return { ...rest, file }; })() : undefined; const stampForUtils = options.stamp ? (() => { const { file, ...rest } = options.stamp; if (file === undefined) { return rest; } if (LibreOfficeUtils.isLibreFileInfo(file)) { return rest; } return { ...rest, file }; })() : undefined; await common_1.PdfEngineWatermarkStampUtils.appendPdfEngineWatermarkStamp(data, { watermark: watermarkForUtils, stamp: stampForUtils }); if (options.watermark?.file !== undefined && LibreOfficeUtils.isLibreFileInfo(options.watermark.file)) { await LibreOfficeUtils.addFilesWithFieldName([options.watermark.file], data, 'watermark'); } if (options.stamp?.file !== undefined && LibreOfficeUtils.isLibreFileInfo(options.stamp.file)) { await LibreOfficeUtils.addFilesWithFieldName([options.stamp.file], data, 'stamp'); } } if (options.rotate) { (0, common_1.appendPdfEngineRotate)(data, options.rotate); } } } exports.LibreOfficeUtils = LibreOfficeUtils; //# sourceMappingURL=libre-office.utils.js.map