UNPKG

@peculiar/pdf-form-json

Version:

A PDF module enabling working with form elements through JSON.

204 lines (191 loc) 6.07 kB
import * as pdfDoc from '@peculiar/pdf-doc'; class ComponentConverter { constructor(type) { this.type = type; } } class ComponentConverterFactory { constructor(...converters) { this.items = new Map(); for (const converter of converters) { this.register(converter); } } register(converter) { this.items.set(converter.type, converter); } find(type) { const converter = this.items.get(type); return converter || null; } get(type) { const converter = this.find(type); if (!converter) { throw new Error(`Converter not found for type ${type.name}`); } return converter; } } class FieldConverter extends ComponentConverter { export(component) { const json = { type: this.typeJSON, id: component.id, name: component.name }; this.onExport(component, json); return json; } } class WidgetConverter extends ComponentConverter { export(component) { const json = { type: this.typeJSON, id: component.id, name: component.name, position: { left: component.left, top: component.top, height: component.height, width: component.width }, flags: { hidden: component.hidden, invisible: component.invisible, locked: component.locked, lockedContents: component.lockedContents, noExport: component.noExport, noRotate: component.noRotate, noView: component.noView, noZoom: component.noZoom, print: component.print, readOnly: component.readOnly, readOnlyAnnot: component.readOnlyAnnot, required: component.required, toggleNoView: component.toggleNoView } }; this.onExport(component, json); return json; } } class CheckBoxConverter extends WidgetConverter { constructor() { super(pdfDoc.CheckBox); this.typeJSON = pdfDoc.FormComponentType.checkBox; } onExport(component, json) { json.checked = component.checked; json.value = component.value; } setValue(component, data) { component.checked = data.checked; } } class ComboBoxConverter extends WidgetConverter { constructor() { super(pdfDoc.ComboBox); this.typeJSON = pdfDoc.FormComponentType.comboBox; } onExport(component, json) { let flags = {}; if (json.flags && typeof json.flags === "object") { flags = json.flags; } json.flags = { ...flags, combo: component.combo, edit: component.edit, sort: component.sort, multiSelect: component.multiSelect, doNotSpellCheck: component.doNotSpellCheck, commitOnSelChange: component.commitOnSelChange }; json.options = component.options; json.selected = component.selected; } setValue(component, data) { component.selected = data.selected; } } class RadioButtonConverter extends WidgetConverter { constructor() { super(pdfDoc.RadioButton); this.typeJSON = pdfDoc.FormComponentType.radioButton; } onExport(component, json) { json.checked = component.checked; json.value = component.value; } setValue(component, data) { component.checked = data.checked; } } class RadioButtonGroupConverter extends FieldConverter { constructor() { super(pdfDoc.RadioButtonGroup); this.typeJSON = pdfDoc.FormComponentType.radioButtonGroup; } onExport(component, json) { json.selected = component.selected; } setValue(component, data) { const button = component.get(data.selected); button.checked = true; } } class TextEditorConverter extends WidgetConverter { constructor() { super(pdfDoc.TextEditor); this.typeJSON = pdfDoc.FormComponentType.textEditor; } onExport(component, json) { json.maxLen = component.maxLen; json.multiline = component.multiline; json.text = component.text; } setValue(component, data) { component.text = data.text; } } class FormConverter { constructor(registry) { this.registry = registry; } export(doc) { const res = { form: {} }; const components = doc.getComponents(); for (const component of components) { const obj = this.exportComponent(component); if (obj) { res.form[obj.name] = obj; } } return res; } exportComponent(component) { const converter = this.registry.find(component.constructor); if (converter) { return converter.export(component); } return null; } setValue(doc, data) { for (const item of data) { const component = doc.getComponentByName(item.name); if (!component) { continue; } const converter = this.registry.find(component.constructor); if (!converter || converter.typeJSON !== item.type) { continue; } converter.setValue(component, item); } } } const registry = new ComponentConverterFactory(new CheckBoxConverter(), new RadioButtonConverter(), new TextEditorConverter(), new ComboBoxConverter(), new ComboBoxConverter(), new RadioButtonGroupConverter()); const globalFormConverter = new FormConverter(registry); export { CheckBoxConverter, ComboBoxConverter, ComponentConverter, ComponentConverterFactory, FieldConverter, FormConverter, RadioButtonConverter, RadioButtonGroupConverter, TextEditorConverter, WidgetConverter, globalFormConverter };