我正在使用pdfkit生成带有一些自定义内容的pdf,然后将其发送到AWS S3存储桶.
虽然如果我作为一个整体生成文件并上传它完美地工作,但是,如果我想将生成的文件作为八位字节流流式传输,我无法找到任何相关的指针.
我正在寻找nodejs解决方案(或建议).
我在nodejs上有一个函数,可以从许多图像中生成图像,然后从中生成pdf文件。我只尝试一张图片,但我需要添加更多图片,但这似乎不起作用
function HelperHandler() {
this.pdf = function(req, res, next) {
var doc = new PDFDocument;
mergeImages(function(err, image) {
if (err)
return res.json(err);
doc.image(image, 100, 100);
doc.output(function(string) {
res.contentType = "application/pdf";
res.send(string);
});
})
}
}
var mergeImages = function(callback) {
var Canvas = require("canvas")
, fs = require("fs");
fs.readFile(global.root_path + "/images/bg.jpg", function(err, data) {
if (err)
callback("error loading image");
else {
var canvas = new Canvas(408, 939)
, img = new Canvas.Image(data);
ctx = canvas.getContext("2d");
img.onload = function() {
ctx.drawImage(img, …Run Code Online (Sandbox Code Playgroud) 我正在使用PDFKit和NodeJS动态生成PDF文档,我想将所述文档附加到电子邮件中.此刻我正在通过NPM使用Mandril-API.
我可以毫无问题地生成PDF并通过以下方式在浏览器中显示:
doc.pipe(res);
我可以毫无问题地发送电子邮件,但我在获取正确的PDF内容方面失败了.我相当肯定我99%的方式 - 但我错过了一些东西.我已经使用Google/StackOverflow等进行了大量的阅读和测试,但我陷入困境.
我得到的内容是,当我进行base64解码时,我得到:
%PDF-1.3%7 0 obj <</Predictor 15
我设法让我的PDF附件的有效大小为445KB,但这是电子邮件的内容:
--_ av-Ti-H6i8tBBHL4BgoXnyC2Q内容类型:application/pdf Content-Transfer-Encoding:base64 Content-Disposition:attachment; 文件名= "mytestPDF.pdf"
PDF1370obj/Predictor15/COLORS1/BitsPerComponent8/Columns100e ndobj60obj /类型/ x对象/亚型/图像/ BitsPerComponent8/WIDT H100/Height19 /过滤/ FlateDecode/DecodeParms70R/ColorSpace中/ I ndexed/DeviceRGB25580R/Length1751streamxdSSNEhGIRTRkWbY/nHaO MJln7t + vv89ylF111PlYNB9Nm6e9DENsd9FxLFUbOjrgt + ErRgWtj9vPCTBH oohMHl9oZ7IdpC/hxusjTHFFMcxhwIxPlbNorOB + bH8exrrA1DUnzKzq/UXI xT456nxtB59fQNiIrBT2apETJZieZvltpeThrObiZ4ydtY0koKJ2Epb940A1 iXyehONQVXiZr8jRP/NJ3bmjHA0sygAou4Q =
虽然我已经搞砸了几个小时,但我最好的预感是我的PDF内容中有换行/换行错误.我获取PDF内容的方法是创建一个名为buffers的数组,然后:doc.on('data',buffers.push.bind(buffers));
我想我需要添加/ n或/ r等...但我已经和NodeJS和AngularJS一起工作了一个月左右,而且我知道几乎所有我做错了是因为我结束了 - 使问题变得复杂......所以我向大家求助,并希望有一种简单的方法可以将我使用PDFKit创建的新PDF文档中的内容附加到使用NodeJS的电子邮件中.
提前谢谢你......请原谅我的漫无边际,但我大约8小时前开始这个(现在是我的时间凌晨3:25).:)
我正在使用 pdfkit 在 nodewebkit 应用程序中动态生成 PDF 文档。PDF 包含通过 HTTP 请求来自远程源的人们的评论。
\n\n它工作得很好,但是现在我发现当评论是日语、中文、阿拉伯语等时,它无法正确呈现,而且我无法知道评论将以什么语言出现\xe2\x80 \x94事实上,我正在从世界各地收集它们。
\n\n我知道我需要使用正确的字体,其中应该包含正确的字符,如此处所述。我发现这个“google noto”开放字体拥有一切,但问题是没有一个包含所有语言的 TTF 文件,而且也不可能存在,因为字体文件仅限于 65K 字形。
\n\n我正在尝试找到一种解决方案,可以使用 pdfkit 以(几乎)任何语言呈现 PDF 中的文本,而无需编写复杂的语言识别工具,我认为这有点过分了。
\n\n任何想法和建议将不胜感激。
\n\n更新:使用pdfkit 作者的font-manager来替换字体。另外你可能想尝试 phantomJS\xe2\x80\x94 但我还没有这样做。如果您遇到同样的问题,请参阅评论中 @levi 的详细回复。希望能帮助到你。
\n我正在尝试使用节点的 pdfkit 制作 PDF,但遇到一些与文本宽度相关的问题。
我想要的结果是这样的。
Overall comments: This is the comment
that will display here bla bla
extra text here
Run Code Online (Sandbox Code Playgroud)
但我当前的代码得到的是这样的
Overall comments: This is the comment
that will display here blab bla extra text here
Run Code Online (Sandbox Code Playgroud)
为了编写这段文字,我使用以下代码:
doc.font('Courier-Bold').text(padRight('Overall Comments:',28),{continued: true});
doc.font('Courier').text(audit.comment,{width: 100,align: 'justify'});
Run Code Online (Sandbox Code Playgroud)
其中audit.comment是右侧的文本,padRight返回固定大小为28的字符串,在右侧添加空格。
它似乎忽略了宽度选项或者我不知道如何使用它。
我正在使用https://github.com/devongovett/pdfkit生成 PDF 文件,我可以简单地使用类似
app.get('/get-pdf', (req, res) => {
const doc = new PDFDocument();
const filename = 'my_pdf.pdf';
res.setHeader('Content-disposition', 'attachment; filename="' + filename + '"');
res.setHeader('Content-type', 'application/pdf');
const content = "Some content";
doc.y = 300;
doc.text(content, 50, 50);
doc.pipe(res);
doc.end();
});
Run Code Online (Sandbox Code Playgroud)
但我也想生成一个 UPC-A 条形码:
我找到了库https://github.com/lindell/JsBarcode,它可以仅从 12 位代码生成这样的条形码。但是,该库似乎主要用于客户端。
我想用这样的条形码生成一个 PDF,但我不知道该怎么做,或者 JsBarcode 对于这种单一类型的条形码来说是否太复杂。
正如评论中所建议的,我确实尝试使用 UPC-A 字体生成条形码:
app.get('/get-pdf', (req, res) => {
const doc = new PDFDocument();
const filename = 'my_pdf.pdf';
res.setHeader('Content-disposition', 'attachment; filename="' + filename + '"');
res.setHeader('Content-type', …Run Code Online (Sandbox Code Playgroud) 我想以编程方式打印一些 pdf 文档。我现在正在努力使这个 PDFkit 库与 webpack 一起工作。
我已经走了形式:
Can't resolve 'fs' in ..
到
fs.readFileSync is not a function
然后到警告
[BABEL] Note: The code generator has deoptimised the styling of "E:/MyProjects/accountingsystem/node_modules/brotli/dec/dictionary-da
ta.js" as it exceeds the max of "500KB".
Run Code Online (Sandbox Code Playgroud)
然后到
require is not defined- 我被困在这里了。所有这些错误都是在库本身中形成的。
我只有一个文件 - app.js,只有一行代码,它是:
const PDFDocument = require('pdfkit');
我的最终webpack.config.js看起来是这样的:
module.exports = {
// devtool: 'source-map',
entry: './src/app.js',
output: {
path: path.resolve (__dirname, "dist"),
filename: "bundle.js"
}, …Run Code Online (Sandbox Code Playgroud) 我使用 node.js 请求从 URL 获取 JPEG。然后我将图像转换为 base64 缓冲区并将其写入 pdf 文档:
request({ url: url, encoding: null }, function (error, response, body) {
if (!error && response.statusCode == 200) {
var img = new Buffer(body, 'base64');
pdf.image(img, 0, 0);
callback(error, body);
}
});
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
events.js:160
throw er; // Unhandled 'error' event
^
Error: stream.push() after EOF
at readableAddChunk (_stream_readable.js:156:17)
at PDFDocument.Readable.push (_stream_readable.js:134:10)
at PDFDocument._write (/Users/assafshamia/Freebird/node/utils/report_generator/node_modules/pdfkit/js/document.js:156:12)
at PDFReference.finalize (/Users/assafshamia/Freebird/node/utils/report_generator/node_modules/pdfkit/js/reference.js:81:21)
at PDFReference.finalize (/Users/assafshamia/Freebird/node/utils/report_generator/node_modules/pdfkit/js/reference.js:10:59)
at PDFReference.end (/Users/assafshamia/Freebird/node/utils/report_generator/node_modules/pdfkit/js/reference.js:74:21)
at JPEG.embed (/Users/assafshamia/Freebird/node/utils/report_generator/node_modules/pdfkit/js/image/jpeg.js:68:16)
at PDFDocument.image (/Users/assafshamia/Freebird/node/utils/report_generator/node_modules/pdfkit/js/mixins/images.js:34:15)
at addImage …Run Code Online (Sandbox Code Playgroud) I'm having a problem, when I have to pipe() the created document to multiple targets, in my case to a HTTP response and to an email attachment using node-mailer. After the first use in an attachment to an email, nothing gets piped to a response (when calling it from the client, the PDF has 0 bytes).
Response controller:
const doc = await createPdf(course.name, lastRecordDate, ctx);
// Send a notificiation email with attachment
if (query.hasOwnProperty('sendEmail') && query.sendEmail === 'true') { …Run Code Online (Sandbox Code Playgroud) 在我的api路由器中,有一个名为的函数generatePDF,旨在使用 PDFKit 模块在内存中生成 PDF 文件并发送到客户端进行下载,而不是仅显示。
在api.js:
var express = require('express');
var router = express.Router();
const PDFDocument = require('pdfkit');
router.get('/generatePDF', async function(req, res, next) {
var myDoc = new PDFDocument({bufferPages: true});
myDoc.pipe(res);
myDoc.font('Times-Roman')
.fontSize(12)
.text(`this is a test text`);
myDoc.end();
res.writeHead(200, {
'Content-Type': 'application/pdf',
'Content-disposition': 'attachment;filename=test.pdf',
'Content-Length': 1111
});
res.send( myDoc.toString('base64'));
});
module.exports = router;
Run Code Online (Sandbox Code Playgroud)
这不起作用。错误信息是(node:11444) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client。
我怎样才能解决问题并让它发挥作用?
另外,一个相关的问题是如何将 PDF 生成的业务逻辑与路由器分开并将它们链接起来?
node-pdfkit ×10
node.js ×9
javascript ×6
pdf ×3
amazon-s3 ×1
aws-sdk ×1
barcode ×1
cairo ×1
canvas ×1
email ×1
encoding ×1
express ×1
node-canvas ×1
node-streams ×1
nodemailer ×1
pdfkit ×1
webpack ×1