首先,构建一个typeScript的express利用:
package.json
{ "name": "pdf2docx", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "nodemon ./src/index.ts", "build": "tsc --project ./", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "codetyphon", "license": "ISC", "dependencies": { "@types/multer": "^1.4.4", "cors": "^2.8.5", "express": "^4.17.1", "multer": "^1.4.2", "winax": "^1.20.0" }, "devDependencies": { "@types/cors": "^2.8.7", "@types/express": "^4.17.8", "@types/node": "^14.11.2", "nodemon": "^2.0.4", "ts-node": "^9.0.0", "tslint": "^6.1.3", "typescript": "^4.0.3" }}
tsconfig.json
{ "compilerOptions": { "target": "es6", "module": "commonjs", "rootDir": "./src", "outDir": "./build", "esModuleInterop": true, "strict": true }}
srcindex.ts
var express = require('express')import { Request, Response, NextFunction } from 'express'import cors from 'cors'var app = express()app.use(cors())var port = 9090app.get('/', async function (req: Request, res: Response) { res.send('hello')})app.listen(port, '0.0.0.0', () => console.log(`app listening on port ${port}!`))
此时能够启动了:
yarn start
接下来,装置 multer(一个上传的中间件),以便能够上传PDF文件。
yarn add multer
而后,装置 winax,以便操作 activex 。
yarn add winax
当初,package.json如下:
{ "name": "pdf2docx", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "nodemon ./src/index.ts", "build": "tsc --project ./", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "codetyphon", "license": "ISC", "dependencies": { "@types/multer": "^1.4.4", "cors": "^2.8.5", "express": "^4.17.1", "multer": "^1.4.2", "winax": "^1.20.0" }, "devDependencies": { "@types/cors": "^2.8.7", "@types/express": "^4.17.8", "@types/node": "^14.11.2", "nodemon": "^2.0.4", "ts-node": "^9.0.0", "tslint": "^6.1.3", "typescript": "^4.0.3" }}
srcindex.ts 引入multer、winax
import multer from 'multer'var winax = require('winax');
创立Word.Application实例
var word = new winax.Object('Word.Application');
Word.Application的具体用法能够参考 https://docs.microsoft.com/en...
配置 multer:
const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, `${__dirname}/../upload`) }, filename: function (req, file, cb) { cb(null, file.fieldname + '-' + Date.now() + '.pdf') }})const upload = multer({ storage: storage, fileFilter: (req:Request, file, cb) => { if (file.mimetype == "application/pdf") { cb(null, true); } else { cb(null, false); return cb(new Error('Only .pdf format allowed!')); } }})
设置路由:
app.post('/pdf2doc', upload.single('file'), async (req: Request, res: Response) => { try { const { originalname, mimetype, path } = req.file if (mimetype == 'application/pdf') { //do console.log(path) const doc = word.documents.open(path) const name = originalname.replace('.pdf', '.docx') doc.SaveAs2(`${__dirname}/../download/${name}`, 16) doc.close() res.json(`http://localhost:9090/download/${name}`); } else { res.json({ err: true, msg: 'file type is not pdf' }); } } catch (err) { console.log(err) res.sendStatus(400); }})
中间件设置的是file,上传时,文件的字段同样也要时 file
upload.single('file')
设置下载目录
app.use('/download', express.static('download'))
最初,用POST MAN进行测试,一切正常。
残缺的 srcindex.ts:
var express = require('express')import { Request, Response, NextFunction } from 'express'import cors from 'cors'import multer from 'multer'var winax = require('winax');const word = new winax.Object('Word.Application');//https://docs.microsoft.com/en-us/javascript/api/word/word.applicationconst storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, `${__dirname}/../upload`) }, filename: function (req, file, cb) { cb(null, file.fieldname + '-' + Date.now() + '.pdf') }})const upload = multer({ storage: storage, fileFilter: (req:Request, file, cb) => { if (file.mimetype == "application/pdf") { cb(null, true); } else { cb(null, false); return cb(new Error('Only .pdf format allowed!')); } }})var app = express()app.use(cors())app.use('/download', express.static('download'))var port = 9090app.get('/', async function (req: Request, res: Response) { res.send('hello')})app.post('/pdf2doc', upload.single('file'), async (req: Request, res: Response) => { try { const { originalname, mimetype, path } = req.file if (mimetype == 'application/pdf') { //do console.log(path) const doc = word.documents.open(path) const name = originalname.replace('.pdf', '.docx') doc.SaveAs2(`${__dirname}/../download/${name}`, 16) doc.close() res.json(`http://localhost:9090/download/${name}`); } else { res.json({ err: true, msg: 'file type is not pdf' }); } } catch (err) { console.log(err) res.sendStatus(400); }})app.listen(port, '0.0.0.0', () => console.log(`app listening on port ${port}!`))
最初,全副代码位于:https://github.com/codetyphon...