添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
坚韧的开心果  ·  公路安全保护条例·  2 月前    · 
玩足球的斑马  ·  Okta - AWS AppFabric·  3 月前    · 
旅行中的闹钟  ·  containers/bitnami/red ...·  5 月前    · 

需求

公司产品需要生成条形码并可以使用打印机清晰打印产品标签。最终效果类似下图
图片名称
测试过程中使用的为TSC打印机。

遇到问题

起初查找了一些java条形码生成方案。毕竟常见的有Barcode4j、zxing等。由于都能达到目的且Barcode4j条形码相关内容代码更方便查找故选择了Barcode4j。下图为官网提供的demo。(注:不同的条码规格所对应的bean不同,图中为Code39,其中还有Code128等等。只需使用正确的Bean即可。)
图片名称
起初测试使用hp打印机(平常打印纸张的打印机)并没有什么问题,内容也较为清楚。后来更换为TSC打印机(更为专业的条码打印机)后发现条码内容弯弯曲曲,扫码枪根本无法识别。

排查问题

首先排除打印机问题,因为打印机打印其它网站生成的条形码并没有问题(例如菜鸟打印、lodop等)。
最终打开菜鸟打印所生成的pdf查看发现条码内容为矢量图。而我们项目中生成的条形码为png格式图片,再将png条形码图片添加至itext pdf中,再将pdf输出值打印机中。
那么使用Barcode4j生成svg条形码并再将svg加入itext中是否能够解决问题?
经调试是可行的。

相关代码

Barcode4j生成svg条形码文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* 绘制条形码生成到流(code128)
*
* @param msg 条形码内容
*/
@SneakyThrows
public static void generateAtCode128(String msg, String tempFilePath, Double width, Double height, Double dpi, Double fontSize) {
if (StringUtils.isEmpty(msg)) {
return;
}
Code128Bean code128Bean = new Code128Bean();
code128Bean.setModuleWidth(UnitConv.in2mm(1.5f / dpi));
code128Bean.setBarHeight(height);
code128Bean.doQuietZone(false);
code128Bean.setFontSize(fontSize);
// 输出到流
SVGCanvasProvider canvas = new SVGCanvasProvider(false, 0);
// 生成条形码
code128Bean.generateBarcode(canvas, msg);
DocumentFragment frag = canvas.getDOMFragment();
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
Source src = new DOMSource(frag);
Result res = new StreamResult(tempFilePath);
trans.transform(src, res);
}

itext添加svg文件(如果使用的是itext7 简单更代码7.0版本提供了方法,这里为itext5)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* svg添加至pdf 中
*
* @param svgFilePath
* @param width
* @param height
*/
@SneakyThrows
private void pdfWriterSvg(String svgFilePath, double width, double height, float x, float y) {
final String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
UserAgent userAgent = new UserAgentAdapter();
DocumentLoader loader = new DocumentLoader(userAgent);
BridgeContext ctx = new BridgeContext(userAgent, loader);
ctx.setDynamicState(BridgeContext.STATIC);
GVTBuilder builder = new GVTBuilder();
PdfContentByte cb = pdfWriter.getDirectContent();
PdfTemplate svgTemplate = cb.createTemplate((float) width * PAG_PROPORTION, (float) height * PAG_PROPORTION);
PdfGraphics2D g2d = new PdfGraphics2D(svgTemplate, (float) width * PAG_PROPORTION, (float) height * PAG_PROPORTION);
SVGDocument city = factory.createSVGDocument("file:///" + svgFilePath);
GraphicsNode mapGraphics = builder.build(ctx, city);
mapGraphics.paint(g2d);
g2d.dispose();
cb.addTemplate(svgTemplate, x, y);
}