@pdfme/common
Version:
TypeScript base PDF generator and React base UI. Open source, developed by the community, and completely free to use under the MIT license!
217 lines • 9.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkGenerateProps = exports.checkTemplate = exports.checkUIProps = exports.checkDesignerProps = exports.checkPreviewProps = exports.checkUIOptions = exports.checkInputs = exports.checkPlugins = exports.checkFont = exports.b64toUint8Array = exports.isBlankPdf = exports.getB64BasePdf = exports.getInputFromTemplate = exports.migrateTemplate = exports.isHexValid = exports.px2mm = exports.pt2px = exports.pt2mm = exports.mm2pt = exports.getDefaultFont = exports.getFallbackFontName = exports.cloneDeep = void 0;
const zod_1 = require("zod");
const buffer_1 = require("buffer");
const schema_js_1 = require("./schema.js");
const constants_js_1 = require("./constants.js");
exports.cloneDeep = structuredClone;
const uniq = (array) => Array.from(new Set(array));
const getFallbackFontName = (font) => {
const initial = '';
const fallbackFontName = Object.entries(font).reduce((acc, cur) => {
const [fontName, fontValue] = cur;
return !acc && fontValue.fallback ? fontName : acc;
}, initial);
if (fallbackFontName === initial) {
throw Error(`[@pdfme/common] fallback flag is not found in font. true fallback flag must be only one.`);
}
return fallbackFontName;
};
exports.getFallbackFontName = getFallbackFontName;
const getDefaultFont = () => ({
[constants_js_1.DEFAULT_FONT_NAME]: { data: (0, exports.b64toUint8Array)(constants_js_1.DEFAULT_FONT_VALUE), fallback: true },
});
exports.getDefaultFont = getDefaultFont;
const mm2pt = (mm) => {
return parseFloat(String(mm)) * constants_js_1.MM_TO_PT_RATIO;
};
exports.mm2pt = mm2pt;
const pt2mm = (pt) => {
return pt * constants_js_1.PT_TO_MM_RATIO;
};
exports.pt2mm = pt2mm;
const pt2px = (pt) => {
return pt * constants_js_1.PT_TO_PX_RATIO;
};
exports.pt2px = pt2px;
const px2mm = (px) => {
// http://www.endmemo.com/sconvert/millimeterpixel.php
const ratio = 0.26458333333333;
return parseFloat(String(px)) * ratio;
};
exports.px2mm = px2mm;
const blob2Base64Pdf = (blob) => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => {
if (reader.result.startsWith('data:application/pdf;')) {
resolve(reader.result);
}
else {
reject(Error('[@pdfme/common] template.basePdf must be pdf data.'));
}
};
reader.readAsDataURL(blob);
});
};
const isHexValid = (hex) => {
return /^#(?:[A-Fa-f0-9]{3,4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/i.test(hex);
};
exports.isHexValid = isHexValid;
/**
* Migrate from legacy keyed object format to array format
* @param template Template
*/
const migrateTemplate = (template) => {
if (!template.schemas) {
return;
}
if (Array.isArray(template.schemas) &&
template.schemas.length > 0 &&
!Array.isArray(template.schemas[0])) {
template.schemas = template.schemas.map((page) => Object.entries(page).map(([key, value]) => ({
...value,
name: key,
})));
}
};
exports.migrateTemplate = migrateTemplate;
const getInputFromTemplate = (template) => {
(0, exports.migrateTemplate)(template);
const input = {};
template.schemas.forEach((page) => {
page.forEach((schema) => {
if (!schema.readOnly) {
input[schema.name] = schema.content || '';
}
});
});
return [input];
};
exports.getInputFromTemplate = getInputFromTemplate;
const getB64BasePdf = async (customPdf) => {
if (typeof customPdf === 'string' &&
!customPdf.startsWith('data:application/pdf;') &&
typeof window !== 'undefined') {
const response = await fetch(customPdf);
const blob = await response.blob();
return blob2Base64Pdf(blob);
}
if (typeof customPdf === 'string') {
return customPdf;
}
const uint8Array = customPdf instanceof Uint8Array ? customPdf : new Uint8Array(customPdf);
return 'data:application/pdf;base64,' + buffer_1.Buffer.from(uint8Array).toString('base64');
};
exports.getB64BasePdf = getB64BasePdf;
const isBlankPdf = (basePdf) => schema_js_1.BlankPdf.safeParse(basePdf).success;
exports.isBlankPdf = isBlankPdf;
const getByteString = (base64) => buffer_1.Buffer.from(base64, 'base64').toString('binary');
const b64toUint8Array = (base64) => {
const data = base64.split(';base64,')[1] ? base64.split(';base64,')[1] : base64;
const byteString = getByteString(data);
const unit8arr = new Uint8Array(byteString.length);
for (let i = 0; i < byteString.length; i += 1) {
unit8arr[i] = byteString.charCodeAt(i);
}
return unit8arr;
};
exports.b64toUint8Array = b64toUint8Array;
const getFontNamesInSchemas = (schemas) => uniq(schemas
.map((p) => p.map((v) => v.fontName ?? ''))
.reduce((acc, cur) => acc.concat(cur), [])
.filter(Boolean));
const checkFont = (arg) => {
const { font, template: { schemas }, } = arg;
const fontValues = Object.values(font);
const fallbackFontNum = fontValues.reduce((acc, cur) => (cur.fallback ? acc + 1 : acc), 0);
if (fallbackFontNum === 0) {
throw Error(`[@pdfme/common] fallback flag is not found in font. true fallback flag must be only one.
Check this document: https://pdfme.com/docs/custom-fonts#about-font-type`);
}
if (fallbackFontNum > 1) {
throw Error(`[@pdfme/common] ${fallbackFontNum} fallback flags found in font. true fallback flag must be only one.
Check this document: https://pdfme.com/docs/custom-fonts#about-font-type`);
}
const fontNamesInSchemas = getFontNamesInSchemas(schemas);
const fontNames = Object.keys(font);
if (fontNamesInSchemas.some((f) => !fontNames.includes(f))) {
throw Error(`[@pdfme/common] ${fontNamesInSchemas
.filter((f) => !fontNames.includes(f))
.join()} of template.schemas is not found in font.
Check this document: https://pdfme.com/docs/custom-fonts`);
}
};
exports.checkFont = checkFont;
const checkPlugins = (arg) => {
const { plugins, template: { schemas }, } = arg;
const allSchemaTypes = uniq(schemas.map((p) => p.map((v) => v.type)).flat());
const pluginsSchemaTypes = Object.values(plugins).map((p) => p ? p.propPanel.defaultSchema.type : undefined);
if (allSchemaTypes.some((s) => !pluginsSchemaTypes.includes(s))) {
throw Error(`[@pdfme/common] ${allSchemaTypes
.filter((s) => !pluginsSchemaTypes.includes(s))
.join()} of template.schemas is not found in plugins.`);
}
};
exports.checkPlugins = checkPlugins;
const checkProps = (data, zodSchema) => {
try {
zodSchema.parse(data);
}
catch (e) {
if (e instanceof zod_1.z.ZodError) {
const messages = e.issues.map((issue) => `ERROR POSITION: ${issue.path.join('.')}
ERROR MESSAGE: ${issue.message}
--------------------------`);
throw Error(`[@pdfme/common] Invalid argument:
--------------------------
${messages.join('\n')}`);
}
else {
throw Error(`[@pdfme/common] Unexpected parsing error: ${e instanceof Error ? e.message : String(e)}`);
}
}
// Check fonts if template and options exist
if (data && typeof data === 'object' && 'template' in data && 'options' in data) {
const { template, options } = data;
if (options && options.font) {
(0, exports.checkFont)({ font: options.font, template });
}
}
// Check plugins if template and plugins exist
if (data && typeof data === 'object' && 'template' in data && 'plugins' in data) {
const { template, plugins } = data;
if (plugins) {
(0, exports.checkPlugins)({ plugins, template });
}
}
};
const checkInputs = (data) => checkProps(data, schema_js_1.Inputs);
exports.checkInputs = checkInputs;
const checkUIOptions = (data) => checkProps(data, schema_js_1.UIOptions);
exports.checkUIOptions = checkUIOptions;
const checkPreviewProps = (data) => checkProps(data, schema_js_1.PreviewProps);
exports.checkPreviewProps = checkPreviewProps;
const checkDesignerProps = (data) => checkProps(data, schema_js_1.DesignerProps);
exports.checkDesignerProps = checkDesignerProps;
const checkUIProps = (data) => {
if (typeof data === 'object' && data !== null && 'template' in data) {
(0, exports.migrateTemplate)(data.template);
}
checkProps(data, schema_js_1.UIProps);
};
exports.checkUIProps = checkUIProps;
const checkTemplate = (template) => {
(0, exports.migrateTemplate)(template);
checkProps(template, schema_js_1.Template);
};
exports.checkTemplate = checkTemplate;
const checkGenerateProps = (data) => {
if (typeof data === 'object' && data !== null && 'template' in data) {
(0, exports.migrateTemplate)(data.template);
}
checkProps(data, schema_js_1.GenerateProps);
};
exports.checkGenerateProps = checkGenerateProps;
//# sourceMappingURL=helper.js.map