Integrate pdfCropMargins for cropping PDFs (#29)

This commit is contained in:
daniel-j
2024-07-21 17:18:31 +02:00
parent 0f660a0897
commit 6bab3da526
3 changed files with 59 additions and 2 deletions

View File

@@ -10,7 +10,8 @@ const serve = require('koa-static')
const { mkdirp } = require('mkdirp')
const fs = require('fs')
const { spawn } = require('child_process')
const { extname, basename, dirname } = require('path')
const { join, extname, basename, dirname } = require('path')
const resolvepath = require('path').resolve
const FileType = require('file-type')
const { transliterate } = require('transliteration')
const sanitize = require('sanitize-filename')
@@ -418,6 +419,55 @@ router.post('/upload', async (ctx, next) => {
})
return
}
} else if (mimetype == 'application/pdf' && ctx.request.body.pdfcropmargins) {
const dir = dirname(ctx.request.file.path)
const base = basename(ctx.request.file.path, '.pdf')
const outfile = resolvepath(join(dir, `${base}_cropped.pdf`))
let p = new Promise((resolve, reject) => {
let stderr = ''
const pdfcropmargins = spawn('pdfcropmargins', ['-s', '-u', '-o', outfile, basename(ctx.request.file.path)], {
// stdio: 'inherit',
cwd: dirname(ctx.request.file.path)
})
pdfcropmargins.once('error', function (err) {
fs.unlink(ctx.request.file.path, (err) => {
if (err) console.error(err)
else console.log('Removed file', ctx.request.file.path)
})
reject('pdfcropmargins error: ' + err)
})
pdfcropmargins.once('close', (code) => {
fs.unlink(ctx.request.file.path, (err) => {
if (err) console.error(err)
else console.log('Removed file', ctx.request.file.path)
})
if (code !== 0) {
reject('pdfcropmargins error code: ' + code + '\n' + stderr)
return
}
resolve(outfile)
})
pdfcropmargins.stdout.on('data', function (str) {
stderr += str
console.log('pdfcropmargins: ' + str)
})
pdfcropmargins.stderr.on('data', function (str) {
stderr += str
console.log('pdfcropmargins: ' + str)
})
})
try {
data = await p
} catch (err) {
flash(ctx, {
success: false,
message: err.replaceAll(basename(ctx.request.file.path), "infile.pdf").replaceAll(outfile, "outfile.pdf")
})
return
}
} else {
// No conversion
data = ctx.request.file.path