iText 7将条形码添加到每个带有事件的页面

问题描述

我需要在iText Pdf的每一页上添加条形码,所以我认为可能是我需要的事件,但是下面的代码将条形码仅放在最后一页上。

BarcodeEventHandler barCodeHandler = new  BarcodeEventHandler(pdfDoc,doc);
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE,barCodeHandler);

protected class BarcodeEventHandler implements IEventHandler {
    protected PdfDocument Pdfdoc;
    protected Document doc;

    public BarcodeEventHandler(PdfDocument Pdfdoc,Document doc) {
        this.Pdfdoc = Pdfdoc;
        this.doc = doc;
    }

    @Override
    public void handleEvent(Event event) {
        Barcode128 barcode = new Barcode128(Pdfdoc);
        barcode.setCodeType(Barcode128.CODE128);
        barcode.setCode("12345678");
        barcode.setSize(12);
        Rectangle rect = barcode.getBarcodeSize();
        PdfFormXObject formXObject = new PdfFormXObject(new Rectangle(rect.getWidth(),rect.getHeight() + 10));
        PdfCanvas pdfCanvas = new PdfCanvas(formXObject,Pdfdoc);
        barcode.placeBarcode(pdfCanvas,ColorConstants.BLACK,ColorConstants.BLACK);
        Image bCodeImage = new Image(formXObject);
        bCodeImage.setRotationAngle(Math.toradians(90));        
        bCodeImage.setFixedPosition(100,200);       
        doc.add(bCodeImage);
    }
}

还有其他方法可以实现这一目标吗?谢谢。

罗恩

解决方法

由于您正在为特定事件类型注册事件处理程序,因此可以将当前页面从event强制转换为PdfDocumentEvent来获取信息。另外,您根本不需要将Document传递给处理程序。从事件中获取PdfPage后,您可以使用Canvas帮助类轻松地将条形码图像添加到该页面。处理程序代码:

protected class BarcodeEventHandler implements IEventHandler {
    protected PdfDocument Pdfdoc;

    public BarcodeEventHandler(PdfDocument Pdfdoc) {
        this.Pdfdoc = Pdfdoc;
    }

    @Override
    public void handleEvent(Event event) {
        Barcode128 barcode = new Barcode128(Pdfdoc);
        barcode.setCodeType(Barcode128.CODE128);
        barcode.setCode("12345678");
        barcode.setSize(12);
        Rectangle rect = barcode.getBarcodeSize();
        PdfFormXObject formXObject = new PdfFormXObject(new Rectangle(rect.getWidth(),rect.getHeight() + 10));
        PdfCanvas pdfCanvas = new PdfCanvas(formXObject,Pdfdoc);
        barcode.placeBarcode(pdfCanvas,ColorConstants.BLACK,ColorConstants.BLACK);
        Image bCodeImage = new Image(formXObject);
        bCodeImage.setRotationAngle(Math.toRadians(90));
        bCodeImage.setFixedPosition(100,200);

        PdfPage page = ((PdfDocumentEvent)event).getPage();
        new Canvas(page,PageSize.A4.clone()).add(bCodeImage);
    }
}

注册事件处理程序(在向文档添加内容之前一定要这样做):

BarcodeEventHandler barCodeHandler = new  BarcodeEventHandler(pdfDocument);
pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE,barCodeHandler);