问题描述
我正在寻找一种解决方案,它允许我在 Linux 环境中从 Python 应用程序中使用 X.509 认证对 pdf 文档进行数字签名。我遇到了一个名为 JSignPDF 的 Java 工具,它似乎满足了我的所有要求,并且还从 ekiametis in Github 找到了一个很好的 docker 包装器。
然而,我很难弄清楚 API 端点 /pdf/sign 关于要传递的数据的预期格式的确切语法。遗憾的是没有提供 curl 或请求示例
到目前为止,我尝试了不同的东西,例如
files = [('filename','test.pdf'),('file',open('test.pdf','rb'))]
response = requests.post(pdf_sign_url,data=files,headers={'Content-Type': 'application/pdf'})
但总是收到一个
TypeError: Cannot read property 'filename' | at sign (/opt/api/api/controller/pdf-controller.js:8:35)
指向需要 req.body.filename 的 pdf-controller.js
const filename = req.body.filename || 'signed_document';
所以为了验证我没有搞砸我刚刚尝试过的请求
curl -i -X POST -H 'Content-Type: application/json' -d '{"filename":"test.pdf"}' http://localhost:4000/pdf/sign
这也不起作用。在 donctainer 中进行一些调试后,我注意到 req.body 本身是空的。我简单地编辑了应用程序以从 Request-Header 中获取参数,并且奏效了。
我从未真正使用过 Node.js,但这个问题似乎与缺少 body-parser 有关?这就是 app.js 的样子
const express = require('express');
const app = express();
const PDFRoutes = require('./api/route/pdf-routes');
const Validation = require('./api/config/validation');
const PORT = process.env.PORT || 8080;
app.use('/pdf',PDFRoutes);
Validation.validateRequirements();
const server = app.listen(PORT,function () {
console.log('Example app listening on port ' + PORT + '!');
});
哪种正文解析器适合处理 pdf 内容流?
谢谢你帮我弄清楚。顺便说一句,如果您启动 docker-compose up
,它会在 localhost:4000 而不是 :8080 上公开服务,因为它在 github 文档中声明。
解决方法
在 package.json
中使用 ^,最新的库是在 npm install
获取的,因为 express
不再附带默认的正文解析器,我添加了一个原始的解析器,但因为它只能接受一个文件作为八位字节流并且不能混合不同的参数我最终重写了该部分以使用 'multer'
,它提供了一个非常方便的 multipart / form-data
解析器。