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
JavaScript
;
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