在BarcodeDataMatrx中更改模块的大小会裁剪代码图像

时间:2019-02-28 12:15:13

标签: .net itext itext7 datamatrix

我正在将BarcodeDataMatrix添加到现有的pdf文档中。由于此文档是自动处理的,因此每个模块的大小必须根据自动化的规格(大于生成的默认值)。

这可以通过使用barcode.CreateFormX((Canvas)null, moduleSize, pdfDocument)来完成,其中moduleSize是一个会影响代码中每个点的大小的数字。

我遇到的问题是:每当我将moduleSize设置为> 1时,代码就会被裁剪,即缺少顶部和右侧的部分。

当我查看来源时,发现this

        public virtual Rectangle PlaceBarcode(PdfCanvas canvas, Color foreground, float moduleSide) {
        if (image == null) {
            return null;
        }
        if (foreground != null) {
            canvas.SetFillColor(foreground);
        }
        int w = width + 2 * ws;
        int h = height + 2 * ws;
        int stride = (w + 7) / 8;
        for (int k = 0; k < h; ++k) {
            int p = k * stride;
            for (int j = 0; j < w; ++j) {
                int b = image[p + j / 8] & 0xff;
                b <<= j % 8;
                if ((b & 0x80) != 0) {
                    canvas.Rectangle(j * moduleSide, (h - k - 1) * moduleSide, moduleSide, moduleSide);
                }
            }
        }
        canvas.Fill();
        return GetBarcodeSize();
    }

        public virtual PdfFormXObject CreateFormXObject(Color foreground, float moduleSide, PdfDocument document) {
        PdfFormXObject xObject = new PdfFormXObject((Rectangle)null);
        Rectangle rect = PlaceBarcode(new PdfCanvas(xObject, document), foreground, moduleSide);
        xObject.SetBBox(new PdfArray(rect));
        return xObject;
    }

因此,CreateFormX调用PlaceBarcode遍历条形码中的每个“行”,并绘制了modulSize [units]的矩形。但是,它返回条形码尺寸为模块数的矩形。因此,这意味着对于moduleSize> 1的每个值,返回的rect都太小。 在Placebarcode返回之后,CreateFormX对返回的rect执行SetBBox(),我认为对于每个moduleSize> 1来说都太小了。

现在的问题是:我的分析错误吗?如果是,我该如何解决我的问题?

我目前解决此问题的方法是直接调用PlaceBarcode并将条形码或多或少手动添加到页面中。

1 个答案:

答案 0 :(得分:0)

此代码有效(而不是调用CreateFormXObject

        PdfFormXObject bcdObject = new PdfFormXObject((Rectangle)null);
        barcode.PlaceBarcode( new PdfCanvas( bcdObject, pdfDocument ), iText.Kernel.Colors.ColorConstants.BLACK, moduleSize);
        Rectangle r = new Rectangle( barcode.GetHeight() * moduleSize, barcode.GetWidth() * moduleSize );
        bcdObject.SetBBox(new PdfArray(r));

如果我没记错的话,该错误位于PlaceBarcode()的最后一行:

 return GetBarcodeSize();

应阅读

 return GetBarcodeSize(, modulSide, ModulSide );

相反。