java - 在背景不透明的 PDF 上创建条形码叠加层 (iText)

标签 java itext barcode

目前我使用以下代码添加条形码:

PdfContentByte overContent = pdfStamper.getOverContent(page);
Rectangle pageSize = pdfReader.getPageSize(page);

Barcode128 code128 = new Barcode128();
code128.setCode(barcodeText);
code128.setCodeType(Barcode128.CODE128);
PdfTemplate template = code128.createTemplateWithBarcode(overContent, BaseColor.BLACK, BaseColor.BLACK);

Rectangle barcodeSize = code128.getBarcodeSize();

float x = pageSize.getRight() - barcodeSize.getWidth() - 10;
float y = pageSize.getTop() - barcodeSize.getHeight() - 10;

overContent.addTemplate(template, x, y);

不幸的是,生成的标记图像具有透明背景。条形码背后的内容会干扰扫描仪软件:

http://imgur.com/Ga6sVuv

或者我可以添加一个条形码

Image image = code128.createImageWithBarcode(over, BaseColor.BLACK, BaseColor.BLACK);
image.setAbsolutePosition(x, y);
over.addImage(image);

但是在那里,setTransparency 方法似乎什么都不做。

谁能告诉我如何在纯白色背景上创建条形码?

编辑 - 解决方案:

PdfContentByte overContent = pdfStamper.getOverContent(page);
Rectangle pageSize = pdfReader.getPageSize(page);

Barcode128 code128 = new Barcode128();
code128.setCode(barcodeText);
code128.setCodeType(Barcode128.CODE128);

PdfTemplate template = code128.createTemplateWithBarcode(overContent, BaseColor.BLACK, BaseColor.BLACK);

float x = pageSize.getRight() - template.getWidth() - 10;
float y = pageSize.getTop() - template.getHeight() - 10;
float w = pageSize.getRight() - 10;
float h = pageSize.getTop() - 10;

overContent.saveState();
overContent.setColorFill(BaseColor.WHITE);
overContent.rectangle(x-2, y-2, w+4, h+4);
overContent.fill();
overContent.restoreState();

overContent.addTemplate(template, x, y);

最佳答案

请看BarcodeBackground .它将条形码添加到从头开始创建的文档以及浅灰色背景:

enter image description here

您必须对此进行调整以将条形码添加到现有文档中。您可以轻松使用不透明的白色背景,而不是浅灰色背景。这应该不是问题,因为原理是一样的:

我复制了您用来创建条形码的代码:

PdfContentByte canvas = writer.getDirectContent();
Barcode128 code128 = new Barcode128();
code128.setCode("12345XX789XXX");
code128.setCodeType(Barcode128.CODE128);
 PdfTemplate template = code128.createTemplateWithBarcode(
        canvas, BaseColor.BLACK, BaseColor.BLACK);

我使用硬编码坐标并计算条形码的宽度和高度:

float x = 36;
float y = 750;
float w = template.getWidth();
float h = template.getHeight();

在添加条形码之前,我添加了一个特定颜色的矩形。请注意,我使用 saveState()/restoreState() 序列来确保填充颜色在填充矩形后恢复为原始颜色:

canvas.saveState();
canvas.setColorFill(BaseColor.LIGHT_GRAY);
canvas.rectangle(x, y, w, h);
canvas.fill();
canvas.restoreState();

绘制矩形后,您可以添加条形码:

canvas.addTemplate(template, 36, 750);

关于java - 在背景不透明的 PDF 上创建条形码叠加层 (iText),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35454039/

相关文章:

java - 如何在 C# 中创建对象时省略泛型参数?

java - 如何在 Kafka 中使用多个消费者?

java - 试图从条形码设备获取数据

java - 如何阅读条形码.. 任何特定的 API?我需要在 J2ME

java - Java中if/else-if/else转换为三元运算符

java - Spring Boot 1.5.8 URL 不区分大小写配置

javafx - 如何将TableView中的数据写入pdf?

c# - 主要内容重叠在页 footer 分 PDF 文档 iTextSharp

java - 从 iText7 中的表格中删除边框

javascript - 如何使用 javascript/jquery 从图像中读取条形码?