@pdfme/generator 6.1.3 → 6.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/helper.d.ts CHANGED
@@ -2,8 +2,9 @@ import { Schema, Plugins, GeneratorOptions, Template, PDFRenderProps } from '@pd
2
2
  import { PDFPage, PDFDocument, PDFEmbeddedPage } from '@pdfme/pdf-lib';
3
3
  import type { EmbedPdfBox } from './types.js';
4
4
  export declare const getEmbedPdfPages: (arg: {
5
- template: Template;
5
+ options?: GeneratorOptions;
6
6
  pdfDoc: PDFDocument;
7
+ template: Template;
7
8
  }) => Promise<{
8
9
  basePages: (PDFPage | PDFEmbeddedPage)[];
9
10
  embedPdfBoxes: EmbedPdfBox[];
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as pdfLib from "@pdfme/pdf-lib";
2
- import { PDFArray, PDFDict, PDFDocument, PDFEmbeddedPage, PDFFont, PDFHexString, PDFName, PDFObjectCopier, PDFPage, PDFString, TextAlignment } from "@pdfme/pdf-lib";
2
+ import { EncryptedPDFError, PDFArray, PDFDict, PDFDocument, PDFEmbeddedPage, PDFFont, PDFHexString, PDFName, PDFObjectCopier, PDFPage, PDFString, TextAlignment } from "@pdfme/pdf-lib";
3
3
  import { applyInternalLinkAnnotations, checkGenerateProps, cloneDeep, getB64BasePdf, getDefaultFont, getDynamicTemplate, getFallbackFontName, isBlankPdf, mm2pt, normalizeSafeLinkUri, pluginRegistry, pt2mm, registerInternalLinkAnchor, replacePlaceholders, resetInternalLinkAnnotations } from "@pdfme/common";
4
4
  import { getDynamicLayoutForSchema, isDynamicLayoutSchema } from "@pdfme/schemas/dynamicLayout";
5
5
  import * as fontkit from "fontkit";
@@ -10,8 +10,57 @@ import { convertForPdfLayoutProps, hex2PrintingColor } from "@pdfme/schemas/util
10
10
  var TOOL_NAME = "pdfme (https://pdfme.com/)";
11
11
  //#endregion
12
12
  //#region src/helper.ts
13
+ var isEncryptedPdfError = (error) => error instanceof EncryptedPDFError || error instanceof Error && error.message.startsWith("Input document to `PDFDocument.load` is encrypted.");
14
+ var isPasswordFailure = (error) => error instanceof Error && (error.message === "NEEDS PASSWORD" || error.message === "Password incorrect");
15
+ var loadBasePdfWithPassword = async (pdf, password) => {
16
+ try {
17
+ return await PDFDocument.load(pdf, { password });
18
+ } catch (error) {
19
+ if (!isPasswordFailure(error)) throw error;
20
+ throw new Error("[@pdfme/generator] basePdf is encrypted and requires a valid password. Pass options.basePdfPassword to generate().");
21
+ }
22
+ };
23
+ var loadBasePdf = async (pdf, password) => {
24
+ if (password !== void 0) return loadBasePdfWithPassword(pdf, password);
25
+ try {
26
+ return await PDFDocument.load(pdf);
27
+ } catch (error) {
28
+ if (!isEncryptedPdfError(error)) throw error;
29
+ return loadBasePdfWithPassword(pdf, "");
30
+ }
31
+ };
32
+ var getBasePdfPassword = (options) => {
33
+ const password = options?.basePdfPassword;
34
+ return typeof password === "string" ? password : void 0;
35
+ };
36
+ var toBoundingBox = ({ x, y, width, height }) => ({
37
+ left: x,
38
+ bottom: y,
39
+ right: x + width,
40
+ top: y + height
41
+ });
42
+ var toOriginBox = ({ width, height }) => ({
43
+ x: 0,
44
+ y: 0,
45
+ width,
46
+ height
47
+ });
48
+ var getVisibleRect = (rect, sourceBox) => {
49
+ if (!sourceBox) return rect;
50
+ const left = Math.max(rect.x, sourceBox.x);
51
+ const bottom = Math.max(rect.y, sourceBox.y);
52
+ const right = Math.min(rect.x + rect.width, sourceBox.x + sourceBox.width);
53
+ const top = Math.min(rect.y + rect.height, sourceBox.y + sourceBox.height);
54
+ if (right <= left || top <= bottom) return;
55
+ return {
56
+ x: left - sourceBox.x,
57
+ y: bottom - sourceBox.y,
58
+ width: right - left,
59
+ height: top - bottom
60
+ };
61
+ };
13
62
  var getEmbedPdfPages = async (arg) => {
14
- const { template: { schemas, basePdf }, pdfDoc } = arg;
63
+ const { template: { schemas, basePdf }, options, pdfDoc } = arg;
15
64
  let basePages = [];
16
65
  let embedPdfBoxes = [];
17
66
  if (isBlankPdf(basePdf)) {
@@ -44,32 +93,21 @@ var getEmbedPdfPages = async (arg) => {
44
93
  }
45
94
  }));
46
95
  } else {
47
- const willLoadPdf = await getB64BasePdf(basePdf);
48
- const embedPdfPages = (await PDFDocument.load(willLoadPdf)).getPages();
49
- embedPdfBoxes = embedPdfPages.map((p) => ({
50
- mediaBox: p.getMediaBox(),
51
- bleedBox: p.getBleedBox(),
52
- trimBox: p.getTrimBox(),
53
- sourcePage: p
54
- }));
55
- const boundingBoxes = embedPdfPages.map((p) => {
56
- const { x, y, width, height } = p.getMediaBox();
96
+ const embedPdfPages = (await loadBasePdf(await getB64BasePdf(basePdf), getBasePdfPassword(options))).getPages();
97
+ const sourceBoxes = embedPdfPages.map((p) => p.getCropBox());
98
+ embedPdfBoxes = embedPdfPages.map((p, index) => {
99
+ const sourceBox = sourceBoxes[index];
100
+ const outputBox = toOriginBox(sourceBox);
57
101
  return {
58
- left: x,
59
- bottom: y,
60
- right: width,
61
- top: height + y
102
+ mediaBox: outputBox,
103
+ bleedBox: outputBox,
104
+ trimBox: outputBox,
105
+ sourceBox,
106
+ sourcePage: p
62
107
  };
63
108
  });
64
- const transformationMatrices = embedPdfPages.map(() => [
65
- 1,
66
- 0,
67
- 0,
68
- 1,
69
- 0,
70
- 0
71
- ]);
72
- basePages = await pdfDoc.embedPages(embedPdfPages, boundingBoxes, transformationMatrices);
109
+ const boundingBoxes = sourceBoxes.map(toBoundingBox);
110
+ basePages = await pdfDoc.embedPages(embedPdfPages, boundingBoxes);
73
111
  }
74
112
  return {
75
113
  basePages,
@@ -85,7 +123,7 @@ var getSafeUriFromLinkAnnotation = (annotation) => {
85
123
  return uri ? normalizeSafeLinkUri(uri.decodeText()) : void 0;
86
124
  };
87
125
  var copyBasePdfUriLinkAnnotations = (arg) => {
88
- const { sourcePage, targetPage, pdfDoc } = arg;
126
+ const { sourceBox, sourcePage, targetPage, pdfDoc } = arg;
89
127
  const sourceAnnots = sourcePage.node.Annots();
90
128
  if (!sourceAnnots) return;
91
129
  const copier = PDFObjectCopier.for(sourcePage.doc.context, pdfDoc.context);
@@ -96,13 +134,20 @@ var copyBasePdfUriLinkAnnotations = (arg) => {
96
134
  if (!safeUri) continue;
97
135
  const rect = sourceAnnotation.lookupMaybe(PDFName.of("Rect"), PDFArray);
98
136
  if (!rect) continue;
137
+ const visibleRect = getVisibleRect(rect.asRectangle(), sourceBox);
138
+ if (!visibleRect) continue;
99
139
  const border = sourceAnnotation.lookupMaybe(PDFName.of("Border"), PDFArray);
100
140
  const color = sourceAnnotation.lookupMaybe(PDFName.of("C"), PDFArray);
101
141
  const highlightMode = sourceAnnotation.lookupMaybe(PDFName.of("H"), PDFName);
102
142
  const copiedAnnotation = pdfDoc.context.obj({
103
143
  Type: PDFName.of("Annot"),
104
144
  Subtype: PDFName.of("Link"),
105
- Rect: copier.copy(rect),
145
+ Rect: [
146
+ visibleRect.x,
147
+ visibleRect.y,
148
+ visibleRect.x + visibleRect.width,
149
+ visibleRect.y + visibleRect.height
150
+ ],
106
151
  Border: border ? copier.copy(border) : pdfDoc.context.obj([
107
152
  0,
108
153
  0,
@@ -168,6 +213,7 @@ var insertPage = (arg) => {
168
213
  insertedPage.setBleedBox(bleedBox.x, bleedBox.y, bleedBox.width, bleedBox.height);
169
214
  insertedPage.setTrimBox(trimBox.x, trimBox.y, trimBox.width, trimBox.height);
170
215
  if (embedPdfBox.sourcePage) copyBasePdfUriLinkAnnotations({
216
+ sourceBox: embedPdfBox.sourceBox,
171
217
  sourcePage: embedPdfBox.sourcePage,
172
218
  targetPage: insertedPage,
173
219
  pdfDoc
@@ -223,9 +269,15 @@ var registerSchemaAnchor = (_cache, schema, page) => {
223
269
  y: page.getHeight() - mm2pt(schema.position.y)
224
270
  });
225
271
  };
272
+ var getRenderOptions = (options) => {
273
+ const renderOptions = { ...options };
274
+ delete renderOptions.basePdfPassword;
275
+ return renderOptions;
276
+ };
226
277
  var generate = async (props) => {
227
278
  checkGenerateProps(props);
228
279
  const { inputs, template: _template, options = {}, plugins: userPlugins = {} } = props;
280
+ const renderOptions = getRenderOptions(options);
229
281
  const template = cloneDeep(_template);
230
282
  const basePdf = template.basePdf;
231
283
  const isBlankBasePdf = isBlankPdf(basePdf);
@@ -239,6 +291,7 @@ var generate = async (props) => {
239
291
  });
240
292
  const _cache = /* @__PURE__ */ new Map();
241
293
  const cachedEmbedPdfPages = isBlankBasePdf ? void 0 : await getEmbedPdfPages({
294
+ options,
242
295
  template,
243
296
  pdfDoc
244
297
  });
@@ -249,11 +302,12 @@ var generate = async (props) => {
249
302
  const dynamicTemplate = shouldApplyDynamicTemplate ? await getDynamicTemplate({
250
303
  template,
251
304
  input,
252
- options,
305
+ options: renderOptions,
253
306
  _cache,
254
307
  getDynamicHeights: getDynamicLayoutForSchema
255
308
  }) : template;
256
309
  const { basePages, embedPdfBoxes } = cachedEmbedPdfPages ?? await getEmbedPdfPages({
310
+ options,
257
311
  template: dynamicTemplate,
258
312
  pdfDoc
259
313
  });
@@ -292,7 +346,7 @@ var generate = async (props) => {
292
346
  pdfLib,
293
347
  pdfDoc,
294
348
  page,
295
- options,
349
+ options: renderOptions,
296
350
  _cache
297
351
  });
298
352
  }
@@ -318,7 +372,7 @@ var generate = async (props) => {
318
372
  pdfLib,
319
373
  pdfDoc,
320
374
  page,
321
- options,
375
+ options: renderOptions,
322
376
  _cache
323
377
  });
324
378
  }
@@ -330,7 +384,7 @@ var generate = async (props) => {
330
384
  }
331
385
  postProcessing({
332
386
  pdfDoc,
333
- options
387
+ options: renderOptions
334
388
  });
335
389
  return pdfDoc.save();
336
390
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/constants.ts","../src/helper.ts","../src/generate.ts","../src/acroForm.ts","../src/generateForm.ts"],"sourcesContent":["export const TOOL_NAME = 'pdfme (https://pdfme.com/)';\n","import * as fontkit from 'fontkit';\nimport {\n Schema,\n Plugins,\n GeneratorOptions,\n Template,\n PDFRenderProps,\n getB64BasePdf,\n isBlankPdf,\n mm2pt,\n normalizeSafeLinkUri,\n pluginRegistry,\n BasePdf,\n} from '@pdfme/common';\nimport { builtInPlugins } from '@pdfme/schemas/builtins';\nimport {\n PDFPage,\n PDFDocument,\n PDFEmbeddedPage,\n TransformationMatrix,\n PDFDict,\n PDFName,\n PDFArray,\n PDFObjectCopier,\n PDFString,\n PDFHexString,\n} from '@pdfme/pdf-lib';\nimport { TOOL_NAME } from './constants.js';\nimport type { EmbedPdfBox } from './types.js';\n\nexport const getEmbedPdfPages = async (arg: { template: Template; pdfDoc: PDFDocument }) => {\n const {\n template: { schemas, basePdf },\n pdfDoc,\n } = arg as { template: { schemas: Schema[][]; basePdf: BasePdf }; pdfDoc: PDFDocument };\n let basePages: (PDFEmbeddedPage | PDFPage)[] = [];\n let embedPdfBoxes: EmbedPdfBox[] = [];\n\n if (isBlankPdf(basePdf)) {\n const { width: _width, height: _height } = basePdf;\n const width = mm2pt(_width);\n const height = mm2pt(_height);\n basePages = schemas.map(() => {\n const page = PDFPage.create(pdfDoc);\n page.setSize(width, height);\n return page;\n });\n embedPdfBoxes = schemas.map(() => ({\n mediaBox: { x: 0, y: 0, width, height },\n bleedBox: { x: 0, y: 0, width, height },\n trimBox: { x: 0, y: 0, width, height },\n }));\n } else {\n const willLoadPdf = await getB64BasePdf(basePdf);\n const embedPdf = await PDFDocument.load(willLoadPdf);\n const embedPdfPages = embedPdf.getPages();\n embedPdfBoxes = embedPdfPages.map((p) => ({\n mediaBox: p.getMediaBox(),\n bleedBox: p.getBleedBox(),\n trimBox: p.getTrimBox(),\n sourcePage: p,\n }));\n const boundingBoxes = embedPdfPages.map((p) => {\n const { x, y, width, height } = p.getMediaBox();\n return { left: x, bottom: y, right: width, top: height + y };\n });\n const transformationMatrices = embedPdfPages.map(\n () => [1, 0, 0, 1, 0, 0] as TransformationMatrix,\n );\n basePages = await pdfDoc.embedPages(embedPdfPages, boundingBoxes, transformationMatrices);\n }\n return { basePages, embedPdfBoxes };\n};\n\nconst getSafeUriFromLinkAnnotation = (annotation: PDFDict) => {\n if (annotation.lookupMaybe(PDFName.of('Subtype'), PDFName) !== PDFName.of('Link')) return;\n\n const action = annotation.lookupMaybe(PDFName.of('A'), PDFDict);\n if (!action) return;\n\n if (action.lookupMaybe(PDFName.of('S'), PDFName) !== PDFName.of('URI')) return;\n\n const uri = action.lookupMaybe(PDFName.of('URI'), PDFString, PDFHexString);\n return uri ? normalizeSafeLinkUri(uri.decodeText()) : undefined;\n};\n\nconst copyBasePdfUriLinkAnnotations = (arg: {\n sourcePage: PDFPage;\n targetPage: PDFPage;\n pdfDoc: PDFDocument;\n}) => {\n const { sourcePage, targetPage, pdfDoc } = arg;\n const sourceAnnots = sourcePage.node.Annots();\n if (!sourceAnnots) return;\n\n const copier = PDFObjectCopier.for(sourcePage.doc.context, pdfDoc.context);\n\n for (let idx = 0; idx < sourceAnnots.size(); idx += 1) {\n const sourceAnnotation = sourceAnnots.lookupMaybe(idx, PDFDict);\n if (!sourceAnnotation) continue;\n\n const safeUri = getSafeUriFromLinkAnnotation(sourceAnnotation);\n if (!safeUri) continue;\n const rect = sourceAnnotation.lookupMaybe(PDFName.of('Rect'), PDFArray);\n if (!rect) continue;\n\n const border = sourceAnnotation.lookupMaybe(PDFName.of('Border'), PDFArray);\n const color = sourceAnnotation.lookupMaybe(PDFName.of('C'), PDFArray);\n const highlightMode = sourceAnnotation.lookupMaybe(PDFName.of('H'), PDFName);\n\n // Preserve the clickable area and common link hints, but rebuild the URI action so page-bound\n // or unsafe source annotation data is not copied into the generated document.\n const copiedAnnotation = pdfDoc.context.obj({\n Type: PDFName.of('Annot'),\n Subtype: PDFName.of('Link'),\n Rect: copier.copy(rect),\n Border: border ? copier.copy(border) : pdfDoc.context.obj([0, 0, 0]),\n C: color ? copier.copy(color) : undefined,\n H: highlightMode ? copier.copy(highlightMode) : undefined,\n A: {\n Type: PDFName.of('Action'),\n S: PDFName.of('URI'),\n URI: PDFString.of(safeUri),\n },\n });\n\n targetPage.node.addAnnot(pdfDoc.context.register(copiedAnnotation));\n }\n};\n\nexport const validateRequiredFields = (template: Template, inputs: Record<string, unknown>[]) => {\n template.schemas.forEach((schemaPage: Schema[]) =>\n schemaPage.forEach((schema: Schema) => {\n if (schema.required && !schema.readOnly && !inputs.some((input) => input[schema.name])) {\n throw new Error(\n `[@pdfme/generator] input for '${schema.name}' is required to generate this PDF`,\n );\n }\n }),\n );\n};\n\nexport const preprocessing = async (arg: { template: Template; userPlugins: Plugins }) => {\n const { template, userPlugins } = arg;\n const { schemas, basePdf } = template as { schemas: Schema[][]; basePdf: BasePdf };\n const staticSchema: Schema[] = isBlankPdf(basePdf) ? (basePdf.staticSchema ?? []) : [];\n\n const pdfDoc = await PDFDocument.create();\n // @ts-expect-error registerFontkit method is not in type definitions but exists at runtime\n pdfDoc.registerFontkit(fontkit);\n\n const plugins = pluginRegistry(\n Object.values(userPlugins).length > 0 ? userPlugins : builtInPlugins,\n );\n\n const schemaTypes = Array.from(\n new Set(\n schemas\n .flatMap((schemaPage: Schema[]) => schemaPage.map((schema: Schema) => schema.type))\n .concat(staticSchema.map((schema: Schema) => schema.type)),\n ),\n );\n\n const renderObj = schemaTypes.reduce(\n (\n acc: Record<\n string,\n (arg: PDFRenderProps<Schema & { [key: string]: unknown }>) => Promise<void> | void\n >,\n type: string,\n ) => {\n const plugin = plugins.findByType(type);\n\n if (!plugin || !plugin.pdf) {\n throw new Error(`[@pdfme/generator] Plugin or renderer for type ${type} not found.\nCheck this document: https://pdfme.com/docs/custom-schemas`);\n }\n\n // Use type assertion to handle the pdf function with schema type\n return {\n ...acc,\n [type]: plugin.pdf as (\n arg: PDFRenderProps<Schema & { [key: string]: unknown }>,\n ) => Promise<void> | void,\n };\n },\n {} as Record<\n string,\n (arg: PDFRenderProps<Schema & { [key: string]: unknown }>) => Promise<void> | void\n >,\n );\n\n return { pdfDoc, renderObj };\n};\n\nexport const postProcessing = (props: { pdfDoc: PDFDocument; options: GeneratorOptions }) => {\n const { pdfDoc, options } = props;\n const {\n author = TOOL_NAME,\n creationDate = new Date(),\n creator = TOOL_NAME,\n keywords = [],\n lang = 'en',\n modificationDate = new Date(),\n producer = TOOL_NAME,\n subject = '',\n title = '',\n } = options;\n pdfDoc.setAuthor(author);\n pdfDoc.setCreationDate(creationDate);\n pdfDoc.setCreator(creator);\n pdfDoc.setKeywords(keywords);\n pdfDoc.setLanguage(lang);\n pdfDoc.setModificationDate(modificationDate);\n pdfDoc.setProducer(producer);\n pdfDoc.setSubject(subject);\n pdfDoc.setTitle(title);\n};\n\nexport const insertPage = (arg: {\n basePage: PDFEmbeddedPage | PDFPage;\n embedPdfBox: EmbedPdfBox;\n pdfDoc: PDFDocument;\n}) => {\n const { basePage, embedPdfBox, pdfDoc } = arg;\n const size = basePage instanceof PDFEmbeddedPage ? basePage.size() : basePage.getSize();\n const insertedPage =\n basePage instanceof PDFEmbeddedPage\n ? pdfDoc.addPage([size.width, size.height])\n : pdfDoc.addPage(basePage);\n\n if (basePage instanceof PDFEmbeddedPage) {\n insertedPage.drawPage(basePage);\n const { mediaBox, bleedBox, trimBox } = embedPdfBox;\n insertedPage.setMediaBox(mediaBox.x, mediaBox.y, mediaBox.width, mediaBox.height);\n insertedPage.setBleedBox(bleedBox.x, bleedBox.y, bleedBox.width, bleedBox.height);\n insertedPage.setTrimBox(trimBox.x, trimBox.y, trimBox.width, trimBox.height);\n if (embedPdfBox.sourcePage) {\n copyBasePdfUriLinkAnnotations({\n sourcePage: embedPdfBox.sourcePage,\n targetPage: insertedPage,\n pdfDoc,\n });\n }\n }\n\n return insertedPage;\n};\n","import * as pdfLib from '@pdfme/pdf-lib';\nimport type { GenerateProps, Schema, PDFRenderProps, Template } from '@pdfme/common';\nimport {\n checkGenerateProps,\n applyInternalLinkAnnotations,\n getDynamicTemplate,\n isBlankPdf,\n replacePlaceholders,\n pt2mm,\n cloneDeep,\n mm2pt,\n registerInternalLinkAnchor,\n resetInternalLinkAnnotations,\n} from '@pdfme/common';\nimport { getDynamicLayoutForSchema, isDynamicLayoutSchema } from '@pdfme/schemas/dynamicLayout';\nimport {\n insertPage,\n preprocessing,\n postProcessing,\n getEmbedPdfPages,\n validateRequiredFields,\n} from './helper.js';\n\ntype SchemaRenderInfo = {\n schemaNames: string[];\n schemaPages: Map<string, Schema>[];\n};\n\nconst hasDynamicLayoutSchema = (schemas: Schema[][]) => {\n for (let i = 0; i < schemas.length; i += 1) {\n const schemaPage = schemas[i];\n for (let j = 0; j < schemaPage.length; j += 1) {\n if (isDynamicLayoutSchema(schemaPage[j])) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst getSchemaRenderInfo = (schemas: Schema[][]): SchemaRenderInfo => {\n const schemaNameSet = new Set<string>();\n const schemaPages: Map<string, Schema>[] = [];\n\n for (let i = 0; i < schemas.length; i += 1) {\n const schemaPage = schemas[i];\n const schemaMap = new Map<string, Schema>();\n\n for (let j = 0; j < schemaPage.length; j += 1) {\n const schema = schemaPage[j];\n if (!schema.name) {\n continue;\n }\n schemaNameSet.add(schema.name);\n if (!schemaMap.has(schema.name)) {\n schemaMap.set(schema.name, schema);\n }\n }\n\n schemaPages.push(schemaMap);\n }\n\n return { schemaNames: Array.from(schemaNameSet), schemaPages };\n};\n\nconst getAdjustedSchema = (\n schema: Schema,\n boundingBoxLeft: number,\n boundingBoxBottom: number,\n): Schema => {\n if (boundingBoxLeft === 0 && boundingBoxBottom === 0) {\n return schema;\n }\n\n return {\n ...schema,\n position: {\n x: schema.position.x + boundingBoxLeft,\n y: schema.position.y - boundingBoxBottom,\n },\n };\n};\n\nconst registerSchemaAnchor = (\n _cache: Map<string | number, unknown>,\n schema: Schema,\n page: pdfLib.PDFPage,\n) => {\n if (!schema.name) return;\n\n registerInternalLinkAnchor({\n _cache,\n name: schema.name,\n page,\n x: mm2pt(schema.position.x),\n y: page.getHeight() - mm2pt(schema.position.y),\n });\n};\n\nconst generate = async (props: GenerateProps): Promise<Uint8Array<ArrayBuffer>> => {\n checkGenerateProps(props);\n const { inputs, template: _template, options = {}, plugins: userPlugins = {} } = props;\n const template = cloneDeep(_template);\n\n const basePdf = template.basePdf;\n const isBlankBasePdf = isBlankPdf(basePdf);\n const staticSchemas = isBlankBasePdf ? (basePdf.staticSchema ?? []) : [];\n const shouldApplyDynamicTemplate = isBlankBasePdf && hasDynamicLayoutSchema(template.schemas);\n\n if (inputs.length === 0) {\n throw new Error(\n '[@pdfme/generator] inputs should not be empty, pass at least an empty object in the array',\n );\n }\n\n validateRequiredFields(template, inputs);\n\n const { pdfDoc, renderObj } = await preprocessing({ template, userPlugins });\n\n const _cache = new Map<string | number, unknown>();\n // Dynamic layout is only applied to blank PDFs, so custom base PDF pages can be embedded once.\n const cachedEmbedPdfPages = isBlankBasePdf\n ? undefined\n : await getEmbedPdfPages({\n template,\n pdfDoc,\n });\n const cachedRenderInfo = shouldApplyDynamicTemplate\n ? undefined\n : getSchemaRenderInfo(template.schemas);\n\n for (let i = 0; i < inputs.length; i += 1) {\n const input = inputs[i];\n resetInternalLinkAnnotations(_cache);\n\n const dynamicTemplate: Template = shouldApplyDynamicTemplate\n ? await getDynamicTemplate({\n template,\n input,\n options,\n _cache,\n getDynamicHeights: getDynamicLayoutForSchema,\n })\n : template;\n const { basePages, embedPdfBoxes } =\n cachedEmbedPdfPages ??\n (await getEmbedPdfPages({\n template: dynamicTemplate,\n pdfDoc,\n }));\n\n const schemas = dynamicTemplate.schemas;\n const { schemaNames, schemaPages } = shouldApplyDynamicTemplate\n ? getSchemaRenderInfo(schemas)\n : (cachedRenderInfo as SchemaRenderInfo);\n\n for (let j = 0; j < basePages.length; j += 1) {\n const basePage = basePages[j];\n const embedPdfBox = embedPdfBoxes[j];\n\n const boundingBoxLeft =\n basePage instanceof pdfLib.PDFEmbeddedPage ? pt2mm(embedPdfBox.mediaBox.x) : 0;\n const boundingBoxBottom =\n basePage instanceof pdfLib.PDFEmbeddedPage ? pt2mm(embedPdfBox.mediaBox.y) : 0;\n\n const page = insertPage({ basePage, embedPdfBox, pdfDoc });\n const variables = { ...input, totalPages: basePages.length, currentPage: j + 1 };\n\n if (staticSchemas.length > 0) {\n for (let k = 0; k < staticSchemas.length; k += 1) {\n const staticSchema = staticSchemas[k];\n const render = renderObj[staticSchema.type];\n if (!render) {\n continue;\n }\n const value = staticSchema.readOnly\n ? replacePlaceholders({\n content: staticSchema.content || '',\n variables,\n schemas,\n })\n : staticSchema.content || '';\n\n const adjustedStaticSchema = getAdjustedSchema(\n staticSchema,\n boundingBoxLeft,\n boundingBoxBottom,\n );\n registerSchemaAnchor(_cache, adjustedStaticSchema, page);\n\n const staticRenderProps: PDFRenderProps<Schema> = {\n value,\n schema: adjustedStaticSchema,\n basePdf,\n pdfLib,\n pdfDoc,\n page,\n options,\n _cache,\n };\n await render(staticRenderProps);\n }\n }\n\n const schemaPage = schemaPages[j];\n if (!schemaPage) {\n continue;\n }\n\n for (let l = 0; l < schemaNames.length; l += 1) {\n const name = schemaNames[l];\n const schema = schemaPage.get(name);\n if (!schema) {\n continue;\n }\n\n const render = renderObj[schema.type];\n if (!render) {\n continue;\n }\n const value: string = schema.readOnly\n ? replacePlaceholders({\n content: schema.content || '',\n variables,\n schemas,\n })\n : ((input[name] || '') as string);\n\n const adjustedSchema = getAdjustedSchema(schema, boundingBoxLeft, boundingBoxBottom);\n registerSchemaAnchor(_cache, adjustedSchema, page);\n\n const renderProps: PDFRenderProps<Schema> = {\n value,\n schema: adjustedSchema,\n basePdf,\n pdfLib,\n pdfDoc,\n page,\n options,\n _cache,\n };\n await render(renderProps);\n }\n }\n\n applyInternalLinkAnnotations({ _cache, pdfDoc });\n }\n\n postProcessing({ pdfDoc, options });\n\n return pdfDoc.save();\n};\n\nexport default generate;\n","import {\n getDefaultFont,\n getFallbackFontName,\n type Font,\n type PDFRenderProps,\n type Plugin,\n type Schema,\n} from '@pdfme/common';\nimport {\n PDFDict,\n PDFDocument,\n PDFFont,\n PDFName,\n TextAlignment,\n type PDFRadioGroup,\n} from '@pdfme/pdf-lib';\nimport { convertForPdfLayoutProps, hex2PrintingColor } from '@pdfme/schemas/utils';\n\ntype AcroFormSchema = Schema & {\n __acroRequired?: boolean;\n};\n\ntype AcroTextSchema = AcroFormSchema & {\n alignment?: 'left' | 'center' | 'right' | 'justify';\n backgroundColor?: string;\n fontColor?: string;\n fontName?: string;\n fontSize?: number;\n};\n\ntype AcroCheckboxSchema = AcroFormSchema & {\n backgroundColor?: string;\n color?: string;\n};\n\ntype AcroRadioGroupSchema = AcroFormSchema & {\n __acroPageIndex?: number;\n backgroundColor?: string;\n color?: string;\n group?: string;\n};\n\ntype RadioGroupCacheState = {\n optionKeys: Set<string>;\n radioGroup: PDFRadioGroup;\n};\n\nconst DEFAULT_FONT_COLOR = '#000000';\nconst DEFAULT_FONT_SIZE = 13;\nconst DEFAULT_FORM_BORDER_COLOR = '#000000';\nconst FIELD_NAME_COUNTS_CACHE_KEY = 'generateForm:fieldNameCounts';\nconst RADIO_GROUPS_CACHE_KEY = 'generateForm:radioGroups';\n\nconst getNextFieldName = (baseName: string, cache: PDFRenderProps<Schema>['_cache']) => {\n const normalizedBaseName = baseName.trim() || 'field';\n const counts =\n (cache.get(FIELD_NAME_COUNTS_CACHE_KEY) as Map<string, number> | undefined) ??\n new Map<string, number>();\n const count = (counts.get(normalizedBaseName) ?? 0) + 1;\n\n counts.set(normalizedBaseName, count);\n cache.set(FIELD_NAME_COUNTS_CACHE_KEY, counts);\n\n return count === 1 ? normalizedBaseName : `${normalizedBaseName}_${count}`;\n};\n\nconst getFieldName = (schema: Schema, cache: PDFRenderProps<Schema>['_cache']) =>\n getNextFieldName(schema.name, cache);\n\nconst getRadioOptionName = (schema: Schema) => schema.name.trim() || 'option';\n\nconst getRadioGroupName = (schema: AcroRadioGroupSchema) =>\n (schema.group || schema.name).trim() || 'radioGroup';\n\nconst getRadioGroup = (arg: {\n pdfDoc: PDFDocument;\n schema: AcroRadioGroupSchema;\n _cache: PDFRenderProps<Schema>['_cache'];\n}) => {\n const { pdfDoc, schema, _cache } = arg;\n const baseName = getRadioGroupName(schema);\n const optionKey = `${schema.__acroPageIndex ?? 0}:${getRadioOptionName(schema)}`;\n const radioGroups =\n (_cache.get(RADIO_GROUPS_CACHE_KEY) as Map<string, RadioGroupCacheState> | undefined) ??\n new Map<string, RadioGroupCacheState>();\n\n const cached = radioGroups.get(baseName);\n if (cached && !cached.optionKeys.has(optionKey)) {\n cached.optionKeys.add(optionKey);\n return cached.radioGroup;\n }\n\n const radioGroup = pdfDoc.getForm().createRadioGroup(getNextFieldName(baseName, _cache));\n const state = { optionKeys: new Set([optionKey]), radioGroup };\n radioGroups.set(baseName, state);\n _cache.set(RADIO_GROUPS_CACHE_KEY, radioGroups);\n return radioGroup;\n};\n\nconst fetchFontData = async (font: Font, fontName: string) => {\n const fontValue = font[fontName];\n if (!fontValue) {\n throw new Error(`[@pdfme/generator] Font \"${fontName}\" is not configured`);\n }\n\n if (typeof fontValue.data !== 'string' || !fontValue.data.startsWith('http')) {\n return fontValue.data;\n }\n\n const res = await fetch(fontValue.data);\n if (!res.ok) {\n throw new Error(`[@pdfme/generator] Failed to fetch font data from ${fontValue.data}`);\n }\n return res.arrayBuffer();\n};\n\nconst getPdfFont = async (arg: {\n pdfDoc: PDFDocument;\n font: Font;\n fontName: string;\n _cache: PDFRenderProps<Schema>['_cache'];\n}) => {\n const { pdfDoc, font, fontName, _cache } = arg;\n const cacheKey = `generateForm:font:${fontName}`;\n const cached = _cache.get(cacheKey);\n if (cached instanceof PDFFont) {\n return cached;\n }\n\n const pdfFont = await pdfDoc.embedFont(await fetchFontData(font, fontName), {\n subset: font[fontName]?.subset ?? true,\n });\n _cache.set(cacheKey, pdfFont);\n return pdfFont;\n};\n\nconst registerAcroFormFontResource = (pdfDoc: PDFDocument, pdfFont: PDFFont) => {\n const formDict = pdfDoc.getForm().acroForm.dict;\n const context = formDict.context;\n\n const defaultResourcesKey = PDFName.of('DR');\n const fontResourcesKey = PDFName.of('Font');\n let defaultResources = formDict.lookupMaybe(defaultResourcesKey, PDFDict);\n if (!defaultResources) {\n defaultResources = context.obj({});\n formDict.set(defaultResourcesKey, defaultResources);\n }\n\n let fontResources = defaultResources.lookupMaybe(fontResourcesKey, PDFDict);\n if (!fontResources) {\n fontResources = context.obj({});\n defaultResources.set(fontResourcesKey, fontResources);\n }\n\n fontResources.set(PDFName.of(pdfFont.name), pdfFont.ref);\n};\n\nconst getTextAlignment = (alignment: AcroTextSchema['alignment']) => {\n switch (alignment) {\n case 'center':\n return TextAlignment.Center;\n case 'right':\n return TextAlignment.Right;\n default:\n return TextAlignment.Left;\n }\n};\n\nconst renderAcroText = async (arg: PDFRenderProps<Schema>) => {\n const { value, pdfDoc, page, options, schema, _cache } = arg;\n const textSchema = schema as AcroTextSchema;\n const font = options.font ?? getDefaultFont();\n const fontName =\n textSchema.fontName && font[textSchema.fontName]\n ? textSchema.fontName\n : getFallbackFontName(font);\n const pdfFont = await getPdfFont({ pdfDoc, font, fontName, _cache });\n registerAcroFormFontResource(pdfDoc, pdfFont);\n const { position, width, height, rotate } = convertForPdfLayoutProps({\n schema,\n pageHeight: page.getHeight(),\n });\n\n const textField = pdfDoc.getForm().createTextField(getFieldName(schema, _cache));\n\n textField.setText(value || undefined);\n textField.setAlignment(getTextAlignment(textSchema.alignment));\n textField.enableMultiline();\n if (textSchema.__acroRequired) textField.enableRequired();\n\n textField.addToPage(page, {\n x: position.x,\n y: position.y,\n width,\n height,\n rotate,\n font: pdfFont,\n textColor: hex2PrintingColor(textSchema.fontColor || DEFAULT_FONT_COLOR, options.colorType),\n backgroundColor: textSchema.backgroundColor\n ? hex2PrintingColor(textSchema.backgroundColor, options.colorType)\n : undefined,\n borderWidth: 0,\n });\n textField.setFontSize(textSchema.fontSize ?? DEFAULT_FONT_SIZE);\n textField.updateAppearances(pdfFont);\n};\n\nconst renderAcroCheckbox = (arg: PDFRenderProps<Schema>) => {\n const { value, pdfDoc, page, options, schema, _cache } = arg;\n const checkboxSchema = schema as AcroCheckboxSchema;\n const { position, width, height, rotate } = convertForPdfLayoutProps({\n schema,\n pageHeight: page.getHeight(),\n });\n\n const checkBox = pdfDoc.getForm().createCheckBox(getFieldName(schema, _cache));\n if (value === 'true') checkBox.check();\n if (checkboxSchema.__acroRequired) checkBox.enableRequired();\n\n const color = checkboxSchema.color || DEFAULT_FORM_BORDER_COLOR;\n checkBox.addToPage(page, {\n x: position.x,\n y: position.y,\n width,\n height,\n rotate,\n textColor: hex2PrintingColor(color, options.colorType),\n backgroundColor: checkboxSchema.backgroundColor\n ? hex2PrintingColor(checkboxSchema.backgroundColor, options.colorType)\n : undefined,\n borderColor: hex2PrintingColor(color, options.colorType),\n borderWidth: 1,\n });\n checkBox.updateAppearances();\n};\n\nconst renderAcroRadioGroup = (arg: PDFRenderProps<Schema>) => {\n const { value, pdfDoc, page, options, schema, _cache } = arg;\n const radioGroupSchema = schema as AcroRadioGroupSchema;\n const { position, width, height, rotate } = convertForPdfLayoutProps({\n schema,\n pageHeight: page.getHeight(),\n });\n\n const radioGroup = getRadioGroup({ pdfDoc, schema: radioGroupSchema, _cache });\n const color = radioGroupSchema.color || DEFAULT_FORM_BORDER_COLOR;\n const optionName = getRadioOptionName(schema);\n\n if (radioGroupSchema.__acroRequired) radioGroup.enableRequired();\n\n radioGroup.addOptionToPage(optionName, page, {\n x: position.x,\n y: position.y,\n width,\n height,\n rotate,\n textColor: hex2PrintingColor(color, options.colorType),\n backgroundColor: radioGroupSchema.backgroundColor\n ? hex2PrintingColor(radioGroupSchema.backgroundColor, options.colorType)\n : undefined,\n borderColor: hex2PrintingColor(color, options.colorType),\n borderWidth: 1,\n });\n\n if (value === 'true') radioGroup.select(optionName);\n radioGroup.updateAppearances();\n};\n\nexport const acroTextPlugin: Plugin = {\n pdf: renderAcroText,\n ui: () => {},\n propPanel: {\n schema: {},\n defaultSchema: {\n name: '',\n type: 'acroText',\n position: { x: 0, y: 0 },\n width: 10,\n height: 10,\n },\n },\n};\n\nexport const acroRadioGroupPlugin: Plugin = {\n pdf: renderAcroRadioGroup,\n ui: () => {},\n propPanel: {\n schema: {},\n defaultSchema: {\n name: '',\n type: 'acroRadioGroup',\n position: { x: 0, y: 0 },\n width: 8,\n height: 8,\n },\n },\n};\n\nexport const acroCheckboxPlugin: Plugin = {\n pdf: renderAcroCheckbox,\n ui: () => {},\n propPanel: {\n schema: {},\n defaultSchema: {\n name: '',\n type: 'acroCheckbox',\n position: { x: 0, y: 0 },\n width: 8,\n height: 8,\n },\n },\n};\n","import type { GenerateProps, Plugins, Schema, Template } from '@pdfme/common';\nimport { cloneDeep } from '@pdfme/common';\nimport { checkbox, radioGroup, text } from '@pdfme/schemas';\nimport { acroCheckboxPlugin, acroRadioGroupPlugin, acroTextPlugin } from './acroForm.js';\nimport generate from './generate.js';\n\nexport type GenerateFormProps = Omit<GenerateProps, 'inputs'> & {\n inputs?: GenerateProps['inputs'];\n};\n\nconst ACRO_TEXT_TYPE = 'acroText';\nconst ACRO_CHECKBOX_TYPE = 'acroCheckbox';\nconst ACRO_RADIO_GROUP_TYPE = 'acroRadioGroup';\nconst TEXT_TYPE = 'text';\nconst CHECKBOX_TYPE = 'checkbox';\nconst RADIO_GROUP_TYPE = 'radioGroup';\n\nconst hasPluginForType = (plugins: Plugins, type: string) =>\n Object.values(plugins).some((plugin) => plugin.propPanel.defaultSchema.type === type);\n\nconst withAcroFormPlugins = (plugins: Plugins = {}) => {\n const mergedPlugins = { ...plugins };\n\n if (!hasPluginForType(mergedPlugins, TEXT_TYPE)) {\n mergedPlugins.Text = text;\n }\n\n if (!hasPluginForType(mergedPlugins, CHECKBOX_TYPE)) {\n mergedPlugins.Checkbox = checkbox;\n }\n\n if (!hasPluginForType(mergedPlugins, RADIO_GROUP_TYPE)) {\n mergedPlugins.RadioGroup = radioGroup;\n }\n\n if (!hasPluginForType(mergedPlugins, ACRO_TEXT_TYPE)) {\n mergedPlugins.AcroText = acroTextPlugin;\n }\n\n if (!hasPluginForType(mergedPlugins, ACRO_CHECKBOX_TYPE)) {\n mergedPlugins.AcroCheckbox = acroCheckboxPlugin;\n }\n\n if (!hasPluginForType(mergedPlugins, ACRO_RADIO_GROUP_TYPE)) {\n mergedPlugins.AcroRadioGroup = acroRadioGroupPlugin;\n }\n\n return mergedPlugins;\n};\n\nconst toAcroFormSchema = (schema: Schema, pageIndex: number): Schema => {\n if (schema.readOnly) {\n return schema;\n }\n\n const formSchema = schema.required ? { ...schema, required: false } : schema;\n\n if (schema.type === TEXT_TYPE) {\n return { ...formSchema, type: ACRO_TEXT_TYPE, __acroRequired: schema.required };\n }\n if (schema.type === CHECKBOX_TYPE) {\n return { ...formSchema, type: ACRO_CHECKBOX_TYPE, __acroRequired: schema.required };\n }\n if (schema.type === RADIO_GROUP_TYPE) {\n return {\n ...formSchema,\n type: ACRO_RADIO_GROUP_TYPE,\n __acroPageIndex: pageIndex,\n __acroRequired: schema.required,\n };\n }\n\n return formSchema;\n};\n\nconst getAcroFormTemplate = (template: Template): Template => {\n const clonedTemplate = cloneDeep(template);\n clonedTemplate.schemas = clonedTemplate.schemas.map((page, pageIndex) =>\n page.map((schema) => toAcroFormSchema(schema, pageIndex)),\n );\n return clonedTemplate;\n};\n\nconst normalizeInputs = (inputs?: GenerateProps['inputs']) =>\n inputs && inputs.length > 0 ? inputs : [{}];\n\nconst generateForm = async (props: GenerateFormProps): Promise<Uint8Array<ArrayBuffer>> => {\n return generate({\n ...props,\n inputs: normalizeInputs(props.inputs),\n template: getAcroFormTemplate(props.template),\n plugins: withAcroFormPlugins(props.plugins),\n });\n};\n\nexport default generateForm;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/constants.ts","../src/helper.ts","../src/generate.ts","../src/acroForm.ts","../src/generateForm.ts"],"sourcesContent":["export const TOOL_NAME = 'pdfme (https://pdfme.com/)';\n","import * as fontkit from 'fontkit';\nimport {\n Schema,\n Plugins,\n GeneratorOptions,\n Template,\n PDFRenderProps,\n getB64BasePdf,\n isBlankPdf,\n mm2pt,\n normalizeSafeLinkUri,\n pluginRegistry,\n BasePdf,\n} from '@pdfme/common';\nimport { builtInPlugins } from '@pdfme/schemas/builtins';\nimport {\n PDFPage,\n PDFDocument,\n PDFEmbeddedPage,\n PDFDict,\n PDFName,\n PDFArray,\n PDFObjectCopier,\n PDFString,\n PDFHexString,\n EncryptedPDFError,\n} from '@pdfme/pdf-lib';\nimport { TOOL_NAME } from './constants.js';\nimport type { EmbedPdfBox, PdfBox } from './types.js';\n\nconst isEncryptedPdfError = (error: unknown) =>\n error instanceof EncryptedPDFError ||\n (error instanceof Error &&\n error.message.startsWith('Input document to `PDFDocument.load` is encrypted.'));\n\nconst isPasswordFailure = (error: unknown) =>\n error instanceof Error &&\n (error.message === 'NEEDS PASSWORD' || error.message === 'Password incorrect');\n\nconst loadBasePdfWithPassword = async (\n pdf: string | Uint8Array | ArrayBuffer,\n password: string,\n) => {\n try {\n return await PDFDocument.load(pdf, { password });\n } catch (error) {\n if (!isPasswordFailure(error)) {\n throw error;\n }\n throw new Error(\n '[@pdfme/generator] basePdf is encrypted and requires a valid password. Pass options.basePdfPassword to generate().',\n );\n }\n};\n\nconst loadBasePdf = async (pdf: string | Uint8Array | ArrayBuffer, password?: string) => {\n if (password !== undefined) {\n return loadBasePdfWithPassword(pdf, password);\n }\n\n try {\n return await PDFDocument.load(pdf);\n } catch (error) {\n if (!isEncryptedPdfError(error)) {\n throw error;\n }\n return loadBasePdfWithPassword(pdf, '');\n }\n};\n\nconst getBasePdfPassword = (options?: GeneratorOptions) => {\n const password = options?.basePdfPassword;\n return typeof password === 'string' ? password : undefined;\n};\n\nconst toBoundingBox = ({ x, y, width, height }: PdfBox) => ({\n left: x,\n bottom: y,\n right: x + width,\n top: y + height,\n});\n\nconst toOriginBox = ({ width, height }: PdfBox): PdfBox => ({ x: 0, y: 0, width, height });\n\nconst getVisibleRect = (rect: PdfBox, sourceBox?: PdfBox): PdfBox | undefined => {\n if (!sourceBox) {\n return rect;\n }\n\n const left = Math.max(rect.x, sourceBox.x);\n const bottom = Math.max(rect.y, sourceBox.y);\n const right = Math.min(rect.x + rect.width, sourceBox.x + sourceBox.width);\n const top = Math.min(rect.y + rect.height, sourceBox.y + sourceBox.height);\n if (right <= left || top <= bottom) {\n return undefined;\n }\n\n return {\n x: left - sourceBox.x,\n y: bottom - sourceBox.y,\n width: right - left,\n height: top - bottom,\n };\n};\n\nexport const getEmbedPdfPages = async (arg: {\n options?: GeneratorOptions;\n pdfDoc: PDFDocument;\n template: Template;\n}) => {\n const {\n template: { schemas, basePdf },\n options,\n pdfDoc,\n } = arg as {\n options?: GeneratorOptions;\n template: { schemas: Schema[][]; basePdf: BasePdf };\n pdfDoc: PDFDocument;\n };\n let basePages: (PDFEmbeddedPage | PDFPage)[] = [];\n let embedPdfBoxes: EmbedPdfBox[] = [];\n\n if (isBlankPdf(basePdf)) {\n const { width: _width, height: _height } = basePdf;\n const width = mm2pt(_width);\n const height = mm2pt(_height);\n basePages = schemas.map(() => {\n const page = PDFPage.create(pdfDoc);\n page.setSize(width, height);\n return page;\n });\n embedPdfBoxes = schemas.map(() => ({\n mediaBox: { x: 0, y: 0, width, height },\n bleedBox: { x: 0, y: 0, width, height },\n trimBox: { x: 0, y: 0, width, height },\n }));\n } else {\n const willLoadPdf = await getB64BasePdf(basePdf);\n const embedPdf = await loadBasePdf(willLoadPdf, getBasePdfPassword(options));\n const embedPdfPages = embedPdf.getPages();\n const sourceBoxes = embedPdfPages.map((p) => p.getCropBox());\n embedPdfBoxes = embedPdfPages.map((p, index) => {\n const sourceBox = sourceBoxes[index];\n const outputBox = toOriginBox(sourceBox);\n return {\n mediaBox: outputBox,\n bleedBox: outputBox,\n trimBox: outputBox,\n sourceBox,\n sourcePage: p,\n };\n });\n const boundingBoxes = sourceBoxes.map(toBoundingBox);\n basePages = await pdfDoc.embedPages(embedPdfPages, boundingBoxes);\n }\n return { basePages, embedPdfBoxes };\n};\n\nconst getSafeUriFromLinkAnnotation = (annotation: PDFDict) => {\n if (annotation.lookupMaybe(PDFName.of('Subtype'), PDFName) !== PDFName.of('Link')) return;\n\n const action = annotation.lookupMaybe(PDFName.of('A'), PDFDict);\n if (!action) return;\n\n if (action.lookupMaybe(PDFName.of('S'), PDFName) !== PDFName.of('URI')) return;\n\n const uri = action.lookupMaybe(PDFName.of('URI'), PDFString, PDFHexString);\n return uri ? normalizeSafeLinkUri(uri.decodeText()) : undefined;\n};\n\nconst copyBasePdfUriLinkAnnotations = (arg: {\n sourceBox?: PdfBox;\n sourcePage: PDFPage;\n targetPage: PDFPage;\n pdfDoc: PDFDocument;\n}) => {\n const { sourceBox, sourcePage, targetPage, pdfDoc } = arg;\n const sourceAnnots = sourcePage.node.Annots();\n if (!sourceAnnots) return;\n\n const copier = PDFObjectCopier.for(sourcePage.doc.context, pdfDoc.context);\n\n for (let idx = 0; idx < sourceAnnots.size(); idx += 1) {\n const sourceAnnotation = sourceAnnots.lookupMaybe(idx, PDFDict);\n if (!sourceAnnotation) continue;\n\n const safeUri = getSafeUriFromLinkAnnotation(sourceAnnotation);\n if (!safeUri) continue;\n const rect = sourceAnnotation.lookupMaybe(PDFName.of('Rect'), PDFArray);\n if (!rect) continue;\n const visibleRect = getVisibleRect(rect.asRectangle(), sourceBox);\n if (!visibleRect) continue;\n\n const border = sourceAnnotation.lookupMaybe(PDFName.of('Border'), PDFArray);\n const color = sourceAnnotation.lookupMaybe(PDFName.of('C'), PDFArray);\n const highlightMode = sourceAnnotation.lookupMaybe(PDFName.of('H'), PDFName);\n\n // Preserve the clickable area and common link hints, but rebuild the URI action so page-bound\n // or unsafe source annotation data is not copied into the generated document.\n const copiedAnnotation = pdfDoc.context.obj({\n Type: PDFName.of('Annot'),\n Subtype: PDFName.of('Link'),\n Rect: [\n visibleRect.x,\n visibleRect.y,\n visibleRect.x + visibleRect.width,\n visibleRect.y + visibleRect.height,\n ],\n Border: border ? copier.copy(border) : pdfDoc.context.obj([0, 0, 0]),\n C: color ? copier.copy(color) : undefined,\n H: highlightMode ? copier.copy(highlightMode) : undefined,\n A: {\n Type: PDFName.of('Action'),\n S: PDFName.of('URI'),\n URI: PDFString.of(safeUri),\n },\n });\n\n targetPage.node.addAnnot(pdfDoc.context.register(copiedAnnotation));\n }\n};\n\nexport const validateRequiredFields = (template: Template, inputs: Record<string, unknown>[]) => {\n template.schemas.forEach((schemaPage: Schema[]) =>\n schemaPage.forEach((schema: Schema) => {\n if (schema.required && !schema.readOnly && !inputs.some((input) => input[schema.name])) {\n throw new Error(\n `[@pdfme/generator] input for '${schema.name}' is required to generate this PDF`,\n );\n }\n }),\n );\n};\n\nexport const preprocessing = async (arg: { template: Template; userPlugins: Plugins }) => {\n const { template, userPlugins } = arg;\n const { schemas, basePdf } = template as { schemas: Schema[][]; basePdf: BasePdf };\n const staticSchema: Schema[] = isBlankPdf(basePdf) ? (basePdf.staticSchema ?? []) : [];\n\n const pdfDoc = await PDFDocument.create();\n // @ts-expect-error registerFontkit method is not in type definitions but exists at runtime\n pdfDoc.registerFontkit(fontkit);\n\n const plugins = pluginRegistry(\n Object.values(userPlugins).length > 0 ? userPlugins : builtInPlugins,\n );\n\n const schemaTypes = Array.from(\n new Set(\n schemas\n .flatMap((schemaPage: Schema[]) => schemaPage.map((schema: Schema) => schema.type))\n .concat(staticSchema.map((schema: Schema) => schema.type)),\n ),\n );\n\n const renderObj = schemaTypes.reduce(\n (\n acc: Record<\n string,\n (arg: PDFRenderProps<Schema & { [key: string]: unknown }>) => Promise<void> | void\n >,\n type: string,\n ) => {\n const plugin = plugins.findByType(type);\n\n if (!plugin || !plugin.pdf) {\n throw new Error(`[@pdfme/generator] Plugin or renderer for type ${type} not found.\nCheck this document: https://pdfme.com/docs/custom-schemas`);\n }\n\n // Use type assertion to handle the pdf function with schema type\n return {\n ...acc,\n [type]: plugin.pdf as (\n arg: PDFRenderProps<Schema & { [key: string]: unknown }>,\n ) => Promise<void> | void,\n };\n },\n {} as Record<\n string,\n (arg: PDFRenderProps<Schema & { [key: string]: unknown }>) => Promise<void> | void\n >,\n );\n\n return { pdfDoc, renderObj };\n};\n\nexport const postProcessing = (props: { pdfDoc: PDFDocument; options: GeneratorOptions }) => {\n const { pdfDoc, options } = props;\n const {\n author = TOOL_NAME,\n creationDate = new Date(),\n creator = TOOL_NAME,\n keywords = [],\n lang = 'en',\n modificationDate = new Date(),\n producer = TOOL_NAME,\n subject = '',\n title = '',\n } = options;\n pdfDoc.setAuthor(author);\n pdfDoc.setCreationDate(creationDate);\n pdfDoc.setCreator(creator);\n pdfDoc.setKeywords(keywords);\n pdfDoc.setLanguage(lang);\n pdfDoc.setModificationDate(modificationDate);\n pdfDoc.setProducer(producer);\n pdfDoc.setSubject(subject);\n pdfDoc.setTitle(title);\n};\n\nexport const insertPage = (arg: {\n basePage: PDFEmbeddedPage | PDFPage;\n embedPdfBox: EmbedPdfBox;\n pdfDoc: PDFDocument;\n}) => {\n const { basePage, embedPdfBox, pdfDoc } = arg;\n const size = basePage instanceof PDFEmbeddedPage ? basePage.size() : basePage.getSize();\n const insertedPage =\n basePage instanceof PDFEmbeddedPage\n ? pdfDoc.addPage([size.width, size.height])\n : pdfDoc.addPage(basePage);\n\n if (basePage instanceof PDFEmbeddedPage) {\n insertedPage.drawPage(basePage);\n const { mediaBox, bleedBox, trimBox } = embedPdfBox;\n insertedPage.setMediaBox(mediaBox.x, mediaBox.y, mediaBox.width, mediaBox.height);\n insertedPage.setBleedBox(bleedBox.x, bleedBox.y, bleedBox.width, bleedBox.height);\n insertedPage.setTrimBox(trimBox.x, trimBox.y, trimBox.width, trimBox.height);\n if (embedPdfBox.sourcePage) {\n copyBasePdfUriLinkAnnotations({\n sourceBox: embedPdfBox.sourceBox,\n sourcePage: embedPdfBox.sourcePage,\n targetPage: insertedPage,\n pdfDoc,\n });\n }\n }\n\n return insertedPage;\n};\n","import * as pdfLib from '@pdfme/pdf-lib';\nimport type { GenerateProps, GeneratorOptions, Schema, PDFRenderProps, Template } from '@pdfme/common';\nimport {\n checkGenerateProps,\n applyInternalLinkAnnotations,\n getDynamicTemplate,\n isBlankPdf,\n replacePlaceholders,\n pt2mm,\n cloneDeep,\n mm2pt,\n registerInternalLinkAnchor,\n resetInternalLinkAnnotations,\n} from '@pdfme/common';\nimport { getDynamicLayoutForSchema, isDynamicLayoutSchema } from '@pdfme/schemas/dynamicLayout';\nimport {\n insertPage,\n preprocessing,\n postProcessing,\n getEmbedPdfPages,\n validateRequiredFields,\n} from './helper.js';\n\ntype SchemaRenderInfo = {\n schemaNames: string[];\n schemaPages: Map<string, Schema>[];\n};\n\nconst hasDynamicLayoutSchema = (schemas: Schema[][]) => {\n for (let i = 0; i < schemas.length; i += 1) {\n const schemaPage = schemas[i];\n for (let j = 0; j < schemaPage.length; j += 1) {\n if (isDynamicLayoutSchema(schemaPage[j])) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst getSchemaRenderInfo = (schemas: Schema[][]): SchemaRenderInfo => {\n const schemaNameSet = new Set<string>();\n const schemaPages: Map<string, Schema>[] = [];\n\n for (let i = 0; i < schemas.length; i += 1) {\n const schemaPage = schemas[i];\n const schemaMap = new Map<string, Schema>();\n\n for (let j = 0; j < schemaPage.length; j += 1) {\n const schema = schemaPage[j];\n if (!schema.name) {\n continue;\n }\n schemaNameSet.add(schema.name);\n if (!schemaMap.has(schema.name)) {\n schemaMap.set(schema.name, schema);\n }\n }\n\n schemaPages.push(schemaMap);\n }\n\n return { schemaNames: Array.from(schemaNameSet), schemaPages };\n};\n\nconst getAdjustedSchema = (\n schema: Schema,\n boundingBoxLeft: number,\n boundingBoxBottom: number,\n): Schema => {\n if (boundingBoxLeft === 0 && boundingBoxBottom === 0) {\n return schema;\n }\n\n return {\n ...schema,\n position: {\n x: schema.position.x + boundingBoxLeft,\n y: schema.position.y - boundingBoxBottom,\n },\n };\n};\n\nconst registerSchemaAnchor = (\n _cache: Map<string | number, unknown>,\n schema: Schema,\n page: pdfLib.PDFPage,\n) => {\n if (!schema.name) return;\n\n registerInternalLinkAnchor({\n _cache,\n name: schema.name,\n page,\n x: mm2pt(schema.position.x),\n y: page.getHeight() - mm2pt(schema.position.y),\n });\n};\n\nconst getRenderOptions = (options: GeneratorOptions): GeneratorOptions => {\n const renderOptions = { ...options };\n delete renderOptions.basePdfPassword;\n return renderOptions;\n};\n\nconst generate = async (props: GenerateProps): Promise<Uint8Array<ArrayBuffer>> => {\n checkGenerateProps(props);\n const { inputs, template: _template, options = {}, plugins: userPlugins = {} } = props;\n const renderOptions = getRenderOptions(options);\n const template = cloneDeep(_template);\n\n const basePdf = template.basePdf;\n const isBlankBasePdf = isBlankPdf(basePdf);\n const staticSchemas = isBlankBasePdf ? (basePdf.staticSchema ?? []) : [];\n const shouldApplyDynamicTemplate = isBlankBasePdf && hasDynamicLayoutSchema(template.schemas);\n\n if (inputs.length === 0) {\n throw new Error(\n '[@pdfme/generator] inputs should not be empty, pass at least an empty object in the array',\n );\n }\n\n validateRequiredFields(template, inputs);\n\n const { pdfDoc, renderObj } = await preprocessing({ template, userPlugins });\n\n const _cache = new Map<string | number, unknown>();\n // Dynamic layout is only applied to blank PDFs, so custom base PDF pages can be embedded once.\n const cachedEmbedPdfPages = isBlankBasePdf\n ? undefined\n : await getEmbedPdfPages({\n options,\n template,\n pdfDoc,\n });\n const cachedRenderInfo = shouldApplyDynamicTemplate\n ? undefined\n : getSchemaRenderInfo(template.schemas);\n\n for (let i = 0; i < inputs.length; i += 1) {\n const input = inputs[i];\n resetInternalLinkAnnotations(_cache);\n\n const dynamicTemplate: Template = shouldApplyDynamicTemplate\n ? await getDynamicTemplate({\n template,\n input,\n options: renderOptions,\n _cache,\n getDynamicHeights: getDynamicLayoutForSchema,\n })\n : template;\n const { basePages, embedPdfBoxes } =\n cachedEmbedPdfPages ??\n (await getEmbedPdfPages({\n options,\n template: dynamicTemplate,\n pdfDoc,\n }));\n\n const schemas = dynamicTemplate.schemas;\n const { schemaNames, schemaPages } = shouldApplyDynamicTemplate\n ? getSchemaRenderInfo(schemas)\n : (cachedRenderInfo as SchemaRenderInfo);\n\n for (let j = 0; j < basePages.length; j += 1) {\n const basePage = basePages[j];\n const embedPdfBox = embedPdfBoxes[j];\n\n const boundingBoxLeft =\n basePage instanceof pdfLib.PDFEmbeddedPage ? pt2mm(embedPdfBox.mediaBox.x) : 0;\n const boundingBoxBottom =\n basePage instanceof pdfLib.PDFEmbeddedPage ? pt2mm(embedPdfBox.mediaBox.y) : 0;\n\n const page = insertPage({ basePage, embedPdfBox, pdfDoc });\n const variables = { ...input, totalPages: basePages.length, currentPage: j + 1 };\n\n if (staticSchemas.length > 0) {\n for (let k = 0; k < staticSchemas.length; k += 1) {\n const staticSchema = staticSchemas[k];\n const render = renderObj[staticSchema.type];\n if (!render) {\n continue;\n }\n const value = staticSchema.readOnly\n ? replacePlaceholders({\n content: staticSchema.content || '',\n variables,\n schemas,\n })\n : staticSchema.content || '';\n\n const adjustedStaticSchema = getAdjustedSchema(\n staticSchema,\n boundingBoxLeft,\n boundingBoxBottom,\n );\n registerSchemaAnchor(_cache, adjustedStaticSchema, page);\n\n const staticRenderProps: PDFRenderProps<Schema> = {\n value,\n schema: adjustedStaticSchema,\n basePdf,\n pdfLib,\n pdfDoc,\n page,\n options: renderOptions,\n _cache,\n };\n await render(staticRenderProps);\n }\n }\n\n const schemaPage = schemaPages[j];\n if (!schemaPage) {\n continue;\n }\n\n for (let l = 0; l < schemaNames.length; l += 1) {\n const name = schemaNames[l];\n const schema = schemaPage.get(name);\n if (!schema) {\n continue;\n }\n\n const render = renderObj[schema.type];\n if (!render) {\n continue;\n }\n const value: string = schema.readOnly\n ? replacePlaceholders({\n content: schema.content || '',\n variables,\n schemas,\n })\n : ((input[name] || '') as string);\n\n const adjustedSchema = getAdjustedSchema(schema, boundingBoxLeft, boundingBoxBottom);\n registerSchemaAnchor(_cache, adjustedSchema, page);\n\n const renderProps: PDFRenderProps<Schema> = {\n value,\n schema: adjustedSchema,\n basePdf,\n pdfLib,\n pdfDoc,\n page,\n options: renderOptions,\n _cache,\n };\n await render(renderProps);\n }\n }\n\n applyInternalLinkAnnotations({ _cache, pdfDoc });\n }\n\n postProcessing({ pdfDoc, options: renderOptions });\n\n return pdfDoc.save();\n};\n\nexport default generate;\n","import {\n getDefaultFont,\n getFallbackFontName,\n type Font,\n type PDFRenderProps,\n type Plugin,\n type Schema,\n} from '@pdfme/common';\nimport {\n PDFDict,\n PDFDocument,\n PDFFont,\n PDFName,\n TextAlignment,\n type PDFRadioGroup,\n} from '@pdfme/pdf-lib';\nimport { convertForPdfLayoutProps, hex2PrintingColor } from '@pdfme/schemas/utils';\n\ntype AcroFormSchema = Schema & {\n __acroRequired?: boolean;\n};\n\ntype AcroTextSchema = AcroFormSchema & {\n alignment?: 'left' | 'center' | 'right' | 'justify';\n backgroundColor?: string;\n fontColor?: string;\n fontName?: string;\n fontSize?: number;\n};\n\ntype AcroCheckboxSchema = AcroFormSchema & {\n backgroundColor?: string;\n color?: string;\n};\n\ntype AcroRadioGroupSchema = AcroFormSchema & {\n __acroPageIndex?: number;\n backgroundColor?: string;\n color?: string;\n group?: string;\n};\n\ntype RadioGroupCacheState = {\n optionKeys: Set<string>;\n radioGroup: PDFRadioGroup;\n};\n\nconst DEFAULT_FONT_COLOR = '#000000';\nconst DEFAULT_FONT_SIZE = 13;\nconst DEFAULT_FORM_BORDER_COLOR = '#000000';\nconst FIELD_NAME_COUNTS_CACHE_KEY = 'generateForm:fieldNameCounts';\nconst RADIO_GROUPS_CACHE_KEY = 'generateForm:radioGroups';\n\nconst getNextFieldName = (baseName: string, cache: PDFRenderProps<Schema>['_cache']) => {\n const normalizedBaseName = baseName.trim() || 'field';\n const counts =\n (cache.get(FIELD_NAME_COUNTS_CACHE_KEY) as Map<string, number> | undefined) ??\n new Map<string, number>();\n const count = (counts.get(normalizedBaseName) ?? 0) + 1;\n\n counts.set(normalizedBaseName, count);\n cache.set(FIELD_NAME_COUNTS_CACHE_KEY, counts);\n\n return count === 1 ? normalizedBaseName : `${normalizedBaseName}_${count}`;\n};\n\nconst getFieldName = (schema: Schema, cache: PDFRenderProps<Schema>['_cache']) =>\n getNextFieldName(schema.name, cache);\n\nconst getRadioOptionName = (schema: Schema) => schema.name.trim() || 'option';\n\nconst getRadioGroupName = (schema: AcroRadioGroupSchema) =>\n (schema.group || schema.name).trim() || 'radioGroup';\n\nconst getRadioGroup = (arg: {\n pdfDoc: PDFDocument;\n schema: AcroRadioGroupSchema;\n _cache: PDFRenderProps<Schema>['_cache'];\n}) => {\n const { pdfDoc, schema, _cache } = arg;\n const baseName = getRadioGroupName(schema);\n const optionKey = `${schema.__acroPageIndex ?? 0}:${getRadioOptionName(schema)}`;\n const radioGroups =\n (_cache.get(RADIO_GROUPS_CACHE_KEY) as Map<string, RadioGroupCacheState> | undefined) ??\n new Map<string, RadioGroupCacheState>();\n\n const cached = radioGroups.get(baseName);\n if (cached && !cached.optionKeys.has(optionKey)) {\n cached.optionKeys.add(optionKey);\n return cached.radioGroup;\n }\n\n const radioGroup = pdfDoc.getForm().createRadioGroup(getNextFieldName(baseName, _cache));\n const state = { optionKeys: new Set([optionKey]), radioGroup };\n radioGroups.set(baseName, state);\n _cache.set(RADIO_GROUPS_CACHE_KEY, radioGroups);\n return radioGroup;\n};\n\nconst fetchFontData = async (font: Font, fontName: string) => {\n const fontValue = font[fontName];\n if (!fontValue) {\n throw new Error(`[@pdfme/generator] Font \"${fontName}\" is not configured`);\n }\n\n if (typeof fontValue.data !== 'string' || !fontValue.data.startsWith('http')) {\n return fontValue.data;\n }\n\n const res = await fetch(fontValue.data);\n if (!res.ok) {\n throw new Error(`[@pdfme/generator] Failed to fetch font data from ${fontValue.data}`);\n }\n return res.arrayBuffer();\n};\n\nconst getPdfFont = async (arg: {\n pdfDoc: PDFDocument;\n font: Font;\n fontName: string;\n _cache: PDFRenderProps<Schema>['_cache'];\n}) => {\n const { pdfDoc, font, fontName, _cache } = arg;\n const cacheKey = `generateForm:font:${fontName}`;\n const cached = _cache.get(cacheKey);\n if (cached instanceof PDFFont) {\n return cached;\n }\n\n const pdfFont = await pdfDoc.embedFont(await fetchFontData(font, fontName), {\n subset: font[fontName]?.subset ?? true,\n });\n _cache.set(cacheKey, pdfFont);\n return pdfFont;\n};\n\nconst registerAcroFormFontResource = (pdfDoc: PDFDocument, pdfFont: PDFFont) => {\n const formDict = pdfDoc.getForm().acroForm.dict;\n const context = formDict.context;\n\n const defaultResourcesKey = PDFName.of('DR');\n const fontResourcesKey = PDFName.of('Font');\n let defaultResources = formDict.lookupMaybe(defaultResourcesKey, PDFDict);\n if (!defaultResources) {\n defaultResources = context.obj({});\n formDict.set(defaultResourcesKey, defaultResources);\n }\n\n let fontResources = defaultResources.lookupMaybe(fontResourcesKey, PDFDict);\n if (!fontResources) {\n fontResources = context.obj({});\n defaultResources.set(fontResourcesKey, fontResources);\n }\n\n fontResources.set(PDFName.of(pdfFont.name), pdfFont.ref);\n};\n\nconst getTextAlignment = (alignment: AcroTextSchema['alignment']) => {\n switch (alignment) {\n case 'center':\n return TextAlignment.Center;\n case 'right':\n return TextAlignment.Right;\n default:\n return TextAlignment.Left;\n }\n};\n\nconst renderAcroText = async (arg: PDFRenderProps<Schema>) => {\n const { value, pdfDoc, page, options, schema, _cache } = arg;\n const textSchema = schema as AcroTextSchema;\n const font = options.font ?? getDefaultFont();\n const fontName =\n textSchema.fontName && font[textSchema.fontName]\n ? textSchema.fontName\n : getFallbackFontName(font);\n const pdfFont = await getPdfFont({ pdfDoc, font, fontName, _cache });\n registerAcroFormFontResource(pdfDoc, pdfFont);\n const { position, width, height, rotate } = convertForPdfLayoutProps({\n schema,\n pageHeight: page.getHeight(),\n });\n\n const textField = pdfDoc.getForm().createTextField(getFieldName(schema, _cache));\n\n textField.setText(value || undefined);\n textField.setAlignment(getTextAlignment(textSchema.alignment));\n textField.enableMultiline();\n if (textSchema.__acroRequired) textField.enableRequired();\n\n textField.addToPage(page, {\n x: position.x,\n y: position.y,\n width,\n height,\n rotate,\n font: pdfFont,\n textColor: hex2PrintingColor(textSchema.fontColor || DEFAULT_FONT_COLOR, options.colorType),\n backgroundColor: textSchema.backgroundColor\n ? hex2PrintingColor(textSchema.backgroundColor, options.colorType)\n : undefined,\n borderWidth: 0,\n });\n textField.setFontSize(textSchema.fontSize ?? DEFAULT_FONT_SIZE);\n textField.updateAppearances(pdfFont);\n};\n\nconst renderAcroCheckbox = (arg: PDFRenderProps<Schema>) => {\n const { value, pdfDoc, page, options, schema, _cache } = arg;\n const checkboxSchema = schema as AcroCheckboxSchema;\n const { position, width, height, rotate } = convertForPdfLayoutProps({\n schema,\n pageHeight: page.getHeight(),\n });\n\n const checkBox = pdfDoc.getForm().createCheckBox(getFieldName(schema, _cache));\n if (value === 'true') checkBox.check();\n if (checkboxSchema.__acroRequired) checkBox.enableRequired();\n\n const color = checkboxSchema.color || DEFAULT_FORM_BORDER_COLOR;\n checkBox.addToPage(page, {\n x: position.x,\n y: position.y,\n width,\n height,\n rotate,\n textColor: hex2PrintingColor(color, options.colorType),\n backgroundColor: checkboxSchema.backgroundColor\n ? hex2PrintingColor(checkboxSchema.backgroundColor, options.colorType)\n : undefined,\n borderColor: hex2PrintingColor(color, options.colorType),\n borderWidth: 1,\n });\n checkBox.updateAppearances();\n};\n\nconst renderAcroRadioGroup = (arg: PDFRenderProps<Schema>) => {\n const { value, pdfDoc, page, options, schema, _cache } = arg;\n const radioGroupSchema = schema as AcroRadioGroupSchema;\n const { position, width, height, rotate } = convertForPdfLayoutProps({\n schema,\n pageHeight: page.getHeight(),\n });\n\n const radioGroup = getRadioGroup({ pdfDoc, schema: radioGroupSchema, _cache });\n const color = radioGroupSchema.color || DEFAULT_FORM_BORDER_COLOR;\n const optionName = getRadioOptionName(schema);\n\n if (radioGroupSchema.__acroRequired) radioGroup.enableRequired();\n\n radioGroup.addOptionToPage(optionName, page, {\n x: position.x,\n y: position.y,\n width,\n height,\n rotate,\n textColor: hex2PrintingColor(color, options.colorType),\n backgroundColor: radioGroupSchema.backgroundColor\n ? hex2PrintingColor(radioGroupSchema.backgroundColor, options.colorType)\n : undefined,\n borderColor: hex2PrintingColor(color, options.colorType),\n borderWidth: 1,\n });\n\n if (value === 'true') radioGroup.select(optionName);\n radioGroup.updateAppearances();\n};\n\nexport const acroTextPlugin: Plugin = {\n pdf: renderAcroText,\n ui: () => {},\n propPanel: {\n schema: {},\n defaultSchema: {\n name: '',\n type: 'acroText',\n position: { x: 0, y: 0 },\n width: 10,\n height: 10,\n },\n },\n};\n\nexport const acroRadioGroupPlugin: Plugin = {\n pdf: renderAcroRadioGroup,\n ui: () => {},\n propPanel: {\n schema: {},\n defaultSchema: {\n name: '',\n type: 'acroRadioGroup',\n position: { x: 0, y: 0 },\n width: 8,\n height: 8,\n },\n },\n};\n\nexport const acroCheckboxPlugin: Plugin = {\n pdf: renderAcroCheckbox,\n ui: () => {},\n propPanel: {\n schema: {},\n defaultSchema: {\n name: '',\n type: 'acroCheckbox',\n position: { x: 0, y: 0 },\n width: 8,\n height: 8,\n },\n },\n};\n","import type { GenerateProps, Plugins, Schema, Template } from '@pdfme/common';\nimport { cloneDeep } from '@pdfme/common';\nimport { checkbox, radioGroup, text } from '@pdfme/schemas';\nimport { acroCheckboxPlugin, acroRadioGroupPlugin, acroTextPlugin } from './acroForm.js';\nimport generate from './generate.js';\n\nexport type GenerateFormProps = Omit<GenerateProps, 'inputs'> & {\n inputs?: GenerateProps['inputs'];\n};\n\nconst ACRO_TEXT_TYPE = 'acroText';\nconst ACRO_CHECKBOX_TYPE = 'acroCheckbox';\nconst ACRO_RADIO_GROUP_TYPE = 'acroRadioGroup';\nconst TEXT_TYPE = 'text';\nconst CHECKBOX_TYPE = 'checkbox';\nconst RADIO_GROUP_TYPE = 'radioGroup';\n\nconst hasPluginForType = (plugins: Plugins, type: string) =>\n Object.values(plugins).some((plugin) => plugin.propPanel.defaultSchema.type === type);\n\nconst withAcroFormPlugins = (plugins: Plugins = {}) => {\n const mergedPlugins = { ...plugins };\n\n if (!hasPluginForType(mergedPlugins, TEXT_TYPE)) {\n mergedPlugins.Text = text;\n }\n\n if (!hasPluginForType(mergedPlugins, CHECKBOX_TYPE)) {\n mergedPlugins.Checkbox = checkbox;\n }\n\n if (!hasPluginForType(mergedPlugins, RADIO_GROUP_TYPE)) {\n mergedPlugins.RadioGroup = radioGroup;\n }\n\n if (!hasPluginForType(mergedPlugins, ACRO_TEXT_TYPE)) {\n mergedPlugins.AcroText = acroTextPlugin;\n }\n\n if (!hasPluginForType(mergedPlugins, ACRO_CHECKBOX_TYPE)) {\n mergedPlugins.AcroCheckbox = acroCheckboxPlugin;\n }\n\n if (!hasPluginForType(mergedPlugins, ACRO_RADIO_GROUP_TYPE)) {\n mergedPlugins.AcroRadioGroup = acroRadioGroupPlugin;\n }\n\n return mergedPlugins;\n};\n\nconst toAcroFormSchema = (schema: Schema, pageIndex: number): Schema => {\n if (schema.readOnly) {\n return schema;\n }\n\n const formSchema = schema.required ? { ...schema, required: false } : schema;\n\n if (schema.type === TEXT_TYPE) {\n return { ...formSchema, type: ACRO_TEXT_TYPE, __acroRequired: schema.required };\n }\n if (schema.type === CHECKBOX_TYPE) {\n return { ...formSchema, type: ACRO_CHECKBOX_TYPE, __acroRequired: schema.required };\n }\n if (schema.type === RADIO_GROUP_TYPE) {\n return {\n ...formSchema,\n type: ACRO_RADIO_GROUP_TYPE,\n __acroPageIndex: pageIndex,\n __acroRequired: schema.required,\n };\n }\n\n return formSchema;\n};\n\nconst getAcroFormTemplate = (template: Template): Template => {\n const clonedTemplate = cloneDeep(template);\n clonedTemplate.schemas = clonedTemplate.schemas.map((page, pageIndex) =>\n page.map((schema) => toAcroFormSchema(schema, pageIndex)),\n );\n return clonedTemplate;\n};\n\nconst normalizeInputs = (inputs?: GenerateProps['inputs']) =>\n inputs && inputs.length > 0 ? inputs : [{}];\n\nconst generateForm = async (props: GenerateFormProps): Promise<Uint8Array<ArrayBuffer>> => {\n return generate({\n ...props,\n inputs: normalizeInputs(props.inputs),\n template: getAcroFormTemplate(props.template),\n plugins: withAcroFormPlugins(props.plugins),\n });\n};\n\nexport default generateForm;\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,22 +1,14 @@
1
1
  import type { PDFPage } from '@pdfme/pdf-lib';
2
+ export type PdfBox = {
3
+ x: number;
4
+ y: number;
5
+ width: number;
6
+ height: number;
7
+ };
2
8
  export type EmbedPdfBox = {
3
- mediaBox: {
4
- x: number;
5
- y: number;
6
- width: number;
7
- height: number;
8
- };
9
- bleedBox: {
10
- x: number;
11
- y: number;
12
- width: number;
13
- height: number;
14
- };
15
- trimBox: {
16
- x: number;
17
- y: number;
18
- width: number;
19
- height: number;
20
- };
9
+ mediaBox: PdfBox;
10
+ bleedBox: PdfBox;
11
+ trimBox: PdfBox;
12
+ sourceBox?: PdfBox;
21
13
  sourcePage?: PDFPage;
22
14
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pdfme/generator",
3
- "version": "6.1.3",
3
+ "version": "6.1.5",
4
4
  "description": "TypeScript base PDF generator and React base UI. Open source, developed by the community, and completely free to use under the MIT license!",
5
5
  "keywords": [
6
6
  "pdf",