@jsreport/jsreport-pdf-utils
Version:
jsreport extension providing pdf operations like merge or concatenation
148 lines (124 loc) • 5.9 kB
JavaScript
const FooterStyleProblem = require('./footerStyleProblem')
const missingSecretMessage = 'pdf-sign extension uses encryption to store sensitive data and needs secret key to be defined. Please fill "encryption.secretKey" at the root of the config or disable encryption using "encryption.enabled=false".'
module.exports = (reporter, definition) => {
reporter.documentStore.registerComplexType('PdfOperationType', {
templateShortid: { type: 'Edm.String', referenceTo: 'templates' },
type: { type: 'Edm.String' },
mergeToFront: { type: 'Edm.Boolean' },
renderForEveryPage: { type: 'Edm.Boolean' },
mergeWholeDocument: { type: 'Edm.Boolean' },
enabled: { type: 'Edm.Boolean' }
})
reporter.documentStore.registerComplexType('PdfMetaType', {
title: { type: 'Edm.String' },
author: { type: 'Edm.String' },
subject: { type: 'Edm.String' },
keywords: { type: 'Edm.String' },
creator: { type: 'Edm.String' },
producer: { type: 'Edm.String' },
language: { type: 'Edm.String' },
custom: { type: 'Edm.String' }
})
reporter.documentStore.registerComplexType('PdfAType', {
enabled: { type: 'Edm.Boolean' }
})
reporter.documentStore.registerComplexType('PdfAccessibility', {
enabled: { type: 'Edm.Boolean' },
pdfUA: { type: 'Edm.Boolean' }
})
reporter.documentStore.registerComplexType('PdfPasswordType', {
password: { type: 'Edm.String' },
ownerPassword: { type: 'Edm.String' },
printing: { type: 'Edm.String', schema: { type: 'null' } },
modifying: { type: 'Edm.Boolean' },
copying: { type: 'Edm.Boolean' },
annotating: { type: 'Edm.Boolean' },
fillingForms: { type: 'Edm.Boolean' },
contentAccessibility: { type: 'Edm.Boolean' },
documentAssembly: { type: 'Edm.Boolean' }
})
reporter.documentStore.registerComplexType('PdfCompressionType', {
enabled: { type: 'Edm.Boolean' },
jpegQuality: { type: 'Edm.Decimal' },
removeAccessibility: { type: 'Edm.Boolean' },
useObjectStreams: { type: 'Edm.Boolean' },
recompressStreams: { type: 'Edm.Boolean' },
convertImagesToJpeg: { type: 'Edm.Boolean' },
removeEffects: { type: 'Edm.Boolean' }
})
reporter.documentStore.registerComplexType('PdfSignTemplateType', {
certificateAssetShortid: { type: 'Edm.String', referenceTo: 'assets', schema: { type: 'null' } },
reason: { type: 'Edm.String' }
})
if (reporter.documentStore.model.entityTypes.TemplateType) {
reporter.documentStore.model.entityTypes.TemplateType.pdfOperations = { type: 'Collection(jsreport.PdfOperationType)' }
reporter.documentStore.model.entityTypes.TemplateType.pdfMeta = { type: 'jsreport.PdfMetaType', schema: { type: 'null' } }
reporter.documentStore.model.entityTypes.TemplateType.pdfA = { type: 'jsreport.PdfAType', schema: { type: 'null' } }
reporter.documentStore.model.entityTypes.TemplateType.pdfPassword = { type: 'jsreport.PdfPasswordType', schema: { type: 'null' } }
reporter.documentStore.model.entityTypes.TemplateType.pdfSign = { type: 'jsreport.PdfSignTemplateType', schema: { type: 'null' } }
reporter.documentStore.model.entityTypes.TemplateType.pdfAccessibility = { type: 'jsreport.PdfAccessibility', schema: { type: 'null' } }
reporter.documentStore.model.entityTypes.TemplateType.pdfCompression = { type: 'jsreport.PdfCompressionType', schema: { type: 'null' } }
}
reporter.documentStore.on('before-init', () => {
if (reporter.documentStore.model.entityTypes.AssetType) {
reporter.documentStore.registerComplexType('PdfSignAssetType', {
passwordRaw: { type: 'Edm.String', visible: false },
passwordSecure: { type: 'Edm.String', encrypted: true, visible: false },
passwordFilled: { type: 'Edm.Boolean' }
})
reporter.documentStore.model.entityTypes.AssetType.pdfSign = { type: 'jsreport.PdfSignAssetType' }
}
})
reporter.initializeListeners.add('pdf-utils', async (req, res) => {
if (reporter.documentStore.collection('assets') == null) {
return
}
reporter.documentStore.collection('assets').beforeInsertListeners.add('pdf-sign', async (doc, req) => {
if (!doc.pdfSign || !doc.pdfSign.passwordRaw) {
return
}
try {
doc.pdfSign.passwordSecure = await reporter.encryption.encrypt(doc.pdfSign.passwordRaw)
} catch (e) {
if (e.encryptionNoSecret) {
e.message = missingSecretMessage
}
throw e
}
doc.pdfSign.passwordRaw = null
doc.pdfSign.passwordFilled = true
})
reporter.documentStore.collection('assets').beforeUpdateListeners.add('pdf-sign', async (q, u, req) => {
if (!u.$set.pdfSign || !u.$set.pdfSign.passwordRaw) {
return
}
try {
u.$set.pdfSign.passwordSecure = await reporter.encryption.encrypt(u.$set.pdfSign.passwordRaw)
} catch (e) {
if (e.encryptionNoSecret) {
e.message = missingSecretMessage
}
throw e
}
u.$set.pdfSign.passwordRaw = null
u.$set.pdfSign.passwordFilled = true
})
await FooterStyleProblem.startupCheck(reporter)
})
reporter.on('express-configure', (app) => {
app.get('/api/pdf-utils/footer-style-problems', (req, res, next) => {
FooterStyleProblem.getTemlatesAndAssetsWithProblematicFooterStyle(reporter)
.then((problematicEntities) => {
res.json(problematicEntities)
})
.catch(next)
})
app.post('/api/pdf-utils/footer-style-problems', (req, res, next) => {
FooterStyleProblem.fixTemlatesAndAssetsWithProblematicFooterStyle(reporter)
.then(() => {
res.json({ message: 'Footer styles fixed' })
})
.catch(next)
})
})
}