如何使用带有barcode4j库的pdfbox(1.8.12)将Code128条形码图像添加到现有pdf?

Posted

技术标签:

【中文标题】如何使用带有barcode4j库的pdfbox(1.8.12)将Code128条形码图像添加到现有pdf?【英文标题】:How to add Code128 Barcode image to existing pdf using pdfbox(1.8.12) with barcode4j library? 【发布时间】:2016-11-07 11:56:27 【问题描述】:

我正在尝试从barcode4j 库(code128bean,其他条形码bean)生成条形码并尝试添加到现有的pdf。使用以下代码在本地创建条形码图像。

//Create the barcode bean
Code128Bean code128Bean = new Code128Bean();
final int dpi = 150;
code128Bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi)); //makes the narrow bar 
//width exactly one pixel
//bean.setCodeset(2);
code128Bean.doQuietZone(false);

//Open output file
File outputFile = new File("D:/barcode4jcod128.png"); //I dont want to create it
OutputStream code128Stream = new FileOutputStream(outputFile);
try 
    //Set up the canvas provider for monochrome PNG output 
    BitmapCanvasProvider canvas1 = new BitmapCanvasProvider(
            code128Stream, "image/x-png", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);

    //Generate the barcode
    code128Bean.generateBarcode(canvas1, "123456");

    //Signal end of generation
    canvas1.finish();
 finally 
    code128Stream.close();

    我的问题是我不想创建图像并将其保存在本地文件系统中,然后将其作为图像添加到 pdf。我只想动态创建我的意思是动态创建条形码图像并将其添加到 pdf 中。 如何将页面大小(如 PDPage.PAGE_SIZE_A4)设置为我从 catalog.getAllPages() 方法检索到的现有 PDPages,如 (List<PDPage> pages = catalog.getAllPages();)

有人可以帮忙吗?

非常感谢蒂尔曼的帮助。这就是我所做的

public static BufferedImage geBufferedImageForCode128Bean(String barcodeString) 
    Code128Bean code128Bean = new Code128Bean();
    final int dpi = 150;
    code128Bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi)); //makes the narrow bar 
    code128Bean.doQuietZone(false);
    BitmapCanvasProvider canvas1 = new BitmapCanvasProvider(
        dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0
    );
    //Generate the barcode
    code128Bean.generateBarcode(canvas1, barcodeString);
    return canvas1.getBufferedImage();


// main code
PDDocument finalDoc = new PDDocument();
BufferedImage bufferedImage = geBufferedImageForCode128Bean("12345");
PDXObjectImage pdImage = new PDPixelMap(doc, bufferedImage);
PDPageContentStream contentStream = new PDPageContentStream(
    finalDoc, pdPage, true, true, true
);
contentStream.drawXObject(pdImage, 100, 600, 50, 20);
contentStream.close();
finalDoc.addPage(pdPage);
finalDoc.save(new File("D:/Test75.pdf"));

条形码正在创建,但它是以垂直方式创建的。我想以水平方式查看。再次感谢你的帮助。

【问题讨论】:

这是一种禁止编辑问题以添加新问题的方法。此外,我还是在评论中回答了这个问题。 【参考方案1】:

1) 将图像添加到现有页面,同时保留内容:

BitmapCanvasProvider canvas1 = new BitmapCanvasProvider(
    dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0
);
code128Bean.generateBarcode(canvas1, "123456");
canvas1.finish();
BufferedImage bim = canvas1.getBufferedImage();

PDXObjectImage img = new PDPixelMap(doc, bim);
PDPageContentStream contents = new PDPageContentStream(doc, page, true, true, true);
contents.drawXObject(img, 100, 600, bim.getWidth(), bim.getHeight());
contents.close();

2) 在现有页面上将媒体框设置为 A4:

page.setMediaBox(PDPage.PAGE_SIZE_A4);

【讨论】:

非常感谢您的帮助。根据代码中的第 1 行,canvas1 对象仍在使用输出流,其中输出流实习生由 outputfile 创建。 @venkata 对不起!我错过了。我已经调整了答案,还有另一个构造函数。 我找到了另一个构造函数。有什么办法可以在水平模式下制作条形码? @venkata 是的,使用 AffineTransform 作为参数,请参见此处:***.com/questions/26119794/… 是的。 Tilman 现在条码图像处于水平模式。你拯救了我的一天。

以上是关于如何使用带有barcode4j库的pdfbox(1.8.12)将Code128条形码图像添加到现有pdf?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apache PDFBox 创建表格

如何修复jasperReports上barcode4j-2.1.jar中的java.lang.NoClassDefFoundError?

PDFBox 创建带有外部 mp3 或 wav 文件的链接/引用的 Sound 对象

如何使用 jasperreports 和barcode4j 居中对齐条形码

PDFbox 1.7.0 - 如何在使用PDFBox添加新图像时保留现有图像?

带前导零的 Barcode4j UPCA 扫描码