@peculiar/pdf-form-json
Version:
A PDF module enabling working with form elements through JSON.
204 lines (191 loc) • 6.07 kB
JavaScript
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 };