Skip to content

Instantly share code, notes, and snippets.

@tellnes
Created June 14, 2012 13:15
Show Gist options
  • Save tellnes/2930238 to your computer and use it in GitHub Desktop.
Save tellnes/2930238 to your computer and use it in GitHub Desktop.
SVG Rasterizer service for Node.js
var connect = require('connect')
, exec = require('child_process').exec
, fs = require('fs')
, path = require('path')
, seaport = require('seaport')
// Detect tmp dir
var TMP_DIR = (function() {
var dirs = [process.env.TMP, '/tmp', process.cwd()]
for (var i = 0; i < dirs.length; i++) {
var dir = dirs[i]
var isDirectory = false
try {
isDirectory = fs.statSync(dir).isDirectory()
} catch (e) {}
if (isDirectory) return dir
}
}())
// Allowed mime types
var types = { 'image/png': 'png'
, 'image/jpeg': 'jpg'
, 'application/pdf': 'pdf'
, 'image/svg+xml': 'svg'
}
var app = connect()
app.use(connect.bodyParser())
app.use(function(req, res, next) {
var type = req.body.type
, ext = types[type]
if (!ext) return next()
var svg = req.body.svg
if (ext === 'svg') {
addHeaders(req, res)
res.end(svg)
return
}
var filename = getTmpName()
var command = 'java'
+ ' -jar ' + __dirname + '/batik-1.7/batik-rasterizer.jar'
+ ' -m ' + type
+ (Number(req.body.width) ? ' -w ' + Number(req.body.width) : '')
+ ' -d ' + filename + '.' + ext
+ ' ' + filename + '.svg'
fs.writeFile(filename + '.svg', svg, function(err) {
if (err) return next(err)
exec(command, function(err, stdout, stderr) {
if (err) return next(err)
// catch error
if (~stderr.indexOf('SVGConverter.error.while.rasterizing.file')) {
err = new Error('SVGConverter.error.while.rasterizing.file')
err.svg = svg
err.stdout = stdout
err.stderr = stderr
return next(err)
}
addHeaders(req, res)
var file = fs.createReadStream(filename + '.' + ext)
file.on('error', next)
file.pipe(res)
file.on('end', function() {
fs.unlink(filename + '.' + ext)
fs.unlink(filename + '.svg')
})
})
})
})
function addHeaders(req, res) {
var type = req.body.type
res.setHeader('Content-Disposition', 'attachment; filename="' + req.body.filename + '.' + types[type] + '"')
res.setHeader('Content-Type', type)
}
function getTmpName() {
var name = ''
for (var i = 0; i < 32; i++) {
name += Math.floor(Math.random() * 16).toString(16)
}
return path.join(TMP_DIR, name)
}
var pkg = require('./package.json')
seaport.connect(7001).service(pkg.name + '@' + pkg.version, function(port, ready) {
app.listen(port, ready)
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment