如何在 HummusJS 中将请求流修改为新的响应流
How to modify a stream from request to a new response stream in HummusJS
我需要使用 HummusJS 将 png 插入 PDF。
在我的 API 的生产版本中,我将收到一个 post 请求,其中包含我将转换为二进制 reader 流的 base64。 (在下面的示例中,我使用的是从本地文件读取的测试。)
这是我的测试输入流(在 "create" 对象工厂中定义):
hummusReadStreamObject (filePath) {
let fileData = fs.readFileSync(filePath).toString('hex');
let result = []
for (var i = 0; i < fileData.length; i+=2) {
result.push('0x'+fileData[i]+''+fileData[i+1])
}
return new hummus.PDFRStreamForBuffer(result)
},
我生成一个 PNG(我已经确认,PNG 已写入且有效),然后在流的 "finally" 事件期间执行修改
png.on('finish', function () {
create.modifiedPDFResponseStream({
pngFileName,
readStream: create.hummusReadStreamObject('/foo/file/path'),
res
})
})
modifiedPDFResponseStream
现在提取 png 并应该将其附加到文件中:
modifiedPDFResponseStream ({ pngFileName, readStream, res }) {
const writeStream = new hummus.PDFStreamForResponse(res)
const pdfWriter = hummus.createWriterToModify(
readStream,
writeStream,
{ log: `path/to/error.txt` })
debugger
const pageModifier = new hummus.PDFPageModifier(pdfWriter,0);
if (pngFileName) {
const ctx = pageModifier.startContext().getContext()
ctx.drawImage(2, 2, `./path/to/${pngFileName}`)
pageModifier.endContext().writePage()
pdfWriter.end()
}
}
我感觉我接近解决方案了,错误日志没有报告任何问题,但我在通过 Chrome 调试时收到以下异常:
events.js:183 Uncaught Error: write after end
at write_ (_http_outgoing.js:622:15)
at ServerResponse.write (_http_outgoing.js:617:10)
at PDFStreamForResponse.write
问题是否与在 .png 的 .on('finish', ...)
事件期间填充流有关?如果是这样,是否有我可以采取的同步方法来缓解这个问题?
灵感来自 @JAM 在“”
中的解决方案
我通过 .pngWriteStream
方法 return 承诺并在完成时让 writestream 解析解决了这个问题:
return new Promise((resolve, reject) => {
try {
writeStream.on('finish', resolve)
} catch (e) {
$.logger.error(e.message)
reject()
}
所以代替 的:
const png = create.pngWriteStream({ ... })
png.on('finish', function () {
create.modifiedPDFResponseStream({
pngFileName,
readStream: create.hummusReadStreamObject('/foo/file/path'),
res
})
})
我等待承诺的解决
const png = await create.pngWriteStream({
fileName: pngFileName,
value: '123456789' })
img 文件可供 hummus.js 写入 pdf!
create.modifiedPDFResponseStream({
pngFileName,
readStream: create.hummusReadStreamObject('/foo/file/path'),
writeStream: new hummus.PDFStreamForResponse(res)
})
我需要使用 HummusJS 将 png 插入 PDF。
在我的 API 的生产版本中,我将收到一个 post 请求,其中包含我将转换为二进制 reader 流的 base64。 (在下面的示例中,我使用的是从本地文件读取的测试。)
这是我的测试输入流(在 "create" 对象工厂中定义):
hummusReadStreamObject (filePath) {
let fileData = fs.readFileSync(filePath).toString('hex');
let result = []
for (var i = 0; i < fileData.length; i+=2) {
result.push('0x'+fileData[i]+''+fileData[i+1])
}
return new hummus.PDFRStreamForBuffer(result)
},
我生成一个 PNG(我已经确认,PNG 已写入且有效),然后在流的 "finally" 事件期间执行修改
png.on('finish', function () {
create.modifiedPDFResponseStream({
pngFileName,
readStream: create.hummusReadStreamObject('/foo/file/path'),
res
})
})
modifiedPDFResponseStream
现在提取 png 并应该将其附加到文件中:
modifiedPDFResponseStream ({ pngFileName, readStream, res }) {
const writeStream = new hummus.PDFStreamForResponse(res)
const pdfWriter = hummus.createWriterToModify(
readStream,
writeStream,
{ log: `path/to/error.txt` })
debugger
const pageModifier = new hummus.PDFPageModifier(pdfWriter,0);
if (pngFileName) {
const ctx = pageModifier.startContext().getContext()
ctx.drawImage(2, 2, `./path/to/${pngFileName}`)
pageModifier.endContext().writePage()
pdfWriter.end()
}
}
我感觉我接近解决方案了,错误日志没有报告任何问题,但我在通过 Chrome 调试时收到以下异常:
events.js:183 Uncaught Error: write after end
at write_ (_http_outgoing.js:622:15)
at ServerResponse.write (_http_outgoing.js:617:10)
at PDFStreamForResponse.write
问题是否与在 .png 的 .on('finish', ...)
事件期间填充流有关?如果是这样,是否有我可以采取的同步方法来缓解这个问题?
灵感来自 @JAM 在“
我通过 .pngWriteStream
方法 return 承诺并在完成时让 writestream 解析解决了这个问题:
return new Promise((resolve, reject) => {
try {
writeStream.on('finish', resolve)
} catch (e) {
$.logger.error(e.message)
reject()
}
所以代替 的:
const png = create.pngWriteStream({ ... })
png.on('finish', function () {
create.modifiedPDFResponseStream({
pngFileName,
readStream: create.hummusReadStreamObject('/foo/file/path'),
res
})
})
我等待承诺的解决
const png = await create.pngWriteStream({
fileName: pngFileName,
value: '123456789' })
img 文件可供 hummus.js 写入 pdf!
create.modifiedPDFResponseStream({
pngFileName,
readStream: create.hummusReadStreamObject('/foo/file/path'),
writeStream: new hummus.PDFStreamForResponse(res)
})