5

我正在使用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();
});

但我也想生成一个 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', 'application/pdf');

  doc.font('/fonts/UPC-A.ttf').fontSize(50).text('012345678905');
  doc.pipe(res);
  doc.end();
});

我从中得到

在此处输入图像描述

看起来不错,但它看起来并不像常见的 UPC-A 条形码。

我在http://www.fontpalace.com/font-download/UPC-A/使用了字体。

4

4 回答 4

1

从谷歌字体下载ttf条形码字体文件:https ://fonts.google.com/?query=barcode (根据您的要求)

在我的情况下,我只想要没有文本的条形码,所以我使用https://fonts.google.com/specimen/Libre+Barcode+39

将此 ttf 字体文件放在侧public/fonts文件夹中

  doc.font(__dirname+ "/../../public/fonts/LibreBarcode39-Regular.ttf").fontSize(20).text(012345678905);

它将生成以下条形码:

在此处输入图像描述

如果您想将条形码与文本一起使用,请使用此字体:https ://fonts.google.com/specimen/Libre+Barcode+39+Text

于 2020-08-08T12:13:07.400 回答
0

我使用 JSBarcode 和 Canvas 在 pdf 中生成 Barcode。

您需要为此安装 JSBarcode:

npm install jsbarcode

在 PDF 中生成条形码的代码:

var canvas = document.createElement("canvas");
JsBarcode(canvas, "3000001", {
    format: "ean8", height: 20,
    displayValue: false
});
doc.image(canvas.toDataURL(), 10, 10, height:30, width:130);
于 2021-04-07T14:58:51.747 回答
0

我从来没有用过JsBarcode,所以我不能帮你这个库。但逻辑是获取代码栏的Base64字符串并将其像图像一样添加到您的pdf中。

我在我的项目中使用 npm 模块rescode来执行此操作。下面的代码生成一个 ean8 代码栏并将此图像添加到 PDF 中,它工作正常。

codes = require('rescode')
codes.loadModules(['ean8'])
dataEan8 = codes.create('ean8', '12345678')
doc.image(dataEan8, 10, 10, height:30, width:130)
于 2017-03-21T11:14:52.733 回答
0

使用正确的字体文件(UPC-A.ttf在这种情况下是您的)是不够的,数字还需要正确编码。

使用这个 TTF 文件,下面的代码可以工作(假设barcode已经是一个 12 位的字符串,包括一个正确的校验位 - 如果不是,你可以使用类似 npm 模块cdigit的东西首先计算校验位):

const barcodeEncoded =
  // First digit including leftmost bar
  String.fromCharCode(Number(barcode[0]) + 0x50) +
  // Regular digits in the left half
  barcode.slice(1, 6) +
  // Middle bar
  'p' +
  // Differently encoded digits in the right half
  barcode.slice(6, 11).split('').map(x => String.fromCharCode(Number(x) + 0x40)).join('') +
  // Last digit including rightmost bar
  String.fromCharCode(Number(barcode[11]) + 0x60)

有了这个,012345678905就会变成P12345pFGHI@e哪个将是具有此字体的有效 UPC-A 条形码。

有关更多信息,请查看字体的自述文件和有关如何构建此类条形码的本文

于 2021-03-15T08:37:12.480 回答