99 lines
No EOL
3.4 KiB
TypeScript
99 lines
No EOL
3.4 KiB
TypeScript
import express from 'express'
|
|
export const convertTemplateRoute = express.Router();
|
|
import {mimeToExtension} from './report-template'
|
|
import { LibreOfficeFileConverter } from 'libreoffice-file-converter';
|
|
|
|
/** javascript-obfuscator:disable
|
|
* @swagger
|
|
* tags:
|
|
* name: office-convert
|
|
* description: ใช้แปลงไฟล์จากเอกสารที่ libreoffice แปลงได้ x
|
|
*/
|
|
|
|
/** javascript-obfuscator:disable
|
|
* @swagger
|
|
* /api/v1/report-template/convert:
|
|
* post:
|
|
* summary: Create document from template
|
|
* tags: [office-convert]
|
|
* parameters:
|
|
* - name: report_name
|
|
* in: header
|
|
* description: นามสกุลไฟล์ที่อัปโหลดเข้ามา(ตอนนี้ไม่จำเป็นต้องใช้เพราะ soffice ตรวจสอบเอง)
|
|
* required: true
|
|
* schema:
|
|
* type: string
|
|
* example: report
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/octet-stream:
|
|
* schema:
|
|
* type: string
|
|
* format: binary
|
|
* responses:
|
|
* 201:
|
|
* description: file was converted.
|
|
* content:
|
|
* application/pdf:
|
|
* schema:
|
|
* type: string
|
|
* format: binary
|
|
* application/vnd.oasis.opendocument.text:
|
|
* schema:
|
|
* type: string
|
|
* format: binary
|
|
* application/vnd.openxmlformats-officedocument.wordprocessingml.document:
|
|
* schema:
|
|
* type: string
|
|
* format: binary
|
|
* application/msword:
|
|
* schema:
|
|
* type: string
|
|
* format: binary
|
|
* image/png:
|
|
* schema:
|
|
* type: string
|
|
* format: binary
|
|
* image/jpeg:
|
|
* schema:
|
|
* type: string
|
|
* format: binary
|
|
* 500:
|
|
* description: Server error
|
|
*
|
|
*/
|
|
convertTemplateRoute.post("/convert", async function (req, res) {
|
|
try {
|
|
if (!req.headers['content-type'] ||
|
|
!req.headers['accept'] ||
|
|
!req.headers['report_name'] ||
|
|
req.headers['content-type'] !== "application/octet-stream") {
|
|
res.statusCode = 400;
|
|
res.statusMessage = 'Require header: content-type(application/octet-stream) accept, report_name';
|
|
res.end(res.statusMessage);
|
|
console.log(req.headers['content-type'],req.headers['accept'],req.headers['report_name'])
|
|
return
|
|
}
|
|
let outputMediaType = mimeToExtension(req.headers['accept']);
|
|
let reportName = req.headers['report_name']
|
|
console.log('output: ' + outputMediaType);
|
|
const libreOfficeFileConverter = new LibreOfficeFileConverter({
|
|
childProcessOptions: {
|
|
timeout: 60 * 1000,
|
|
},
|
|
});
|
|
const buffer = await libreOfficeFileConverter.convertBuffer(req.body, outputMediaType);
|
|
res.statusCode = 201;
|
|
res.setHeader('Content-Type', req.headers['accept']);
|
|
res.setHeader('Content-Disposition', `attachment;filename=${reportName}.${outputMediaType}`);
|
|
res.setHeader('Content-Length', buffer.length);
|
|
res.end(buffer);
|
|
} catch (ex) {
|
|
res.statusCode = 500;
|
|
res.statusMessage = 'Internal Server Error';
|
|
res.end(res.statusMessage);
|
|
console.error(`Error during convert with soffice:`, ex);
|
|
}
|
|
})
|
|
|