codify-node
Version:
Generates 1D, 2D, and composite barcodes in png, svg, or eps formats.
113 lines (99 loc) • 3.03 kB
text/typescript
import codify from '../binding'
import BinResult from '../types/BinResult'
import OutputType from '../types/enums/OutputType'
import SymbologyConfig from '../types/SymbologyConfig'
/**
* Calls the given function name from the c++ library wrapper, validates
* the struct values and passes the arguments sent in symbologyStruct
* in the correct order.
*
* @param {SymbologyConfig} config - symbology config
* @param {string} barcodeData - primary data to encode
* @return {BinResult}
*/
function createBuffer (config: SymbologyConfig, barcodeData: string): BinResult {
return codify.createStream(
barcodeData,
config.symbology,
config.height,
config.whitespaceWidth,
config.borderWidth,
config.outputOptions,
config.backgroundColor,
config.foregroundColor,
// indicate to the library that we want BMP instead of PNG
// this is to force zint to return a bitmap array buffer instead PNG binary
config.fileName?.replace(/\.png$/g, '.bmp'),
config.scale,
config.option1,
config.option2,
config.option3,
config.showHumanReadableText ? 1 : 0,
(config.text || barcodeData),
config.encoding,
config.eci,
config.primary,
config.rotation,
config.dotSize
)
}
/**
* Renders a png, svg, or eps barcode.
* If PNG, it returns the stream as a base64 string.
*
* @note The file will be created in memory and then passed to the returned object.
*
* @param {SymbologyConfig} config - symbology config
* @param {string} barcodeData - primary data to encode
* @param {OutputType} outputType
* @returns {Promise<BinResult>} object with resulting props (see docs)
*/
function invoke (config: SymbologyConfig, barcodeData: string, outputType: OutputType): Promise<BinResult> {
const symbol = { ...config }
if (![OutputType.PNG, OutputType.EPS, OutputType.SVG].includes(outputType)) {
return Promise.reject(`Invalid output type: ${outputType}`)
}
if (outputType !== OutputType.PNG) {
symbol.fileName = `out.${outputType}`
// apply option 8 (suppress stdout)
if (symbol.outputOptions) {
symbol.outputOptions += 8
} else {
symbol.outputOptions = 8
}
}
const res = binary.createBuffer(symbol, barcodeData)
if (res.code <= 2) {
// remove all data after the trailing EOF marker
res.encodedData = res
.encodedData
.split('<<< EOF >>>')[0]
if (res.code === 0) {
res.message = 'Codify successfully created.'
}
return Promise.resolve(res)
}
return Promise.reject(res.message)
}
/**
* Determines the OutputType of the given file name by its extension. Defaults to PNG.
*
* @param {string} fileName
* @returns {OutputType}
*/
function getOutputType (fileName: string): OutputType {
switch (fileName.toLowerCase().substr(-3)) {
case 'svg':
return OutputType.SVG
case 'eps':
return OutputType.EPS
default:
return OutputType.PNG
}
}
const binary = {
createBuffer,
invoke,
getOutputType
}
export default binary