更改 BarcodeDataMatrx 中模块的大小会裁剪代码图像
Changing the size of a module in BarcodeDataMatrx crops the code image
我正在将 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
遍历条形码中的每个 'line' 并绘制 modulSize [单位] 的矩形。它 returns 然而,它是一个矩形,其中包含模块数量的条形码大小。所以这意味着,对于 moduleSize > 1 的每个值,返回的 rect 都太小了。
在 Placebarcode
returns 之后,CreateFormX
对返回的 rect 执行 SetBBox()
,在我看来,这对于每个 moduleSize > 1 都太小了。
现在的问题是:我的分析是否错误,如果是,我该如何解决我的问题?
我目前的解决方法是直接调用PlaceBarcode
,然后或多或少地手动将条形码添加到页面。
此代码有效(而不是调用 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 );
相反。
我正在将 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
遍历条形码中的每个 'line' 并绘制 modulSize [单位] 的矩形。它 returns 然而,它是一个矩形,其中包含模块数量的条形码大小。所以这意味着,对于 moduleSize > 1 的每个值,返回的 rect 都太小了。
在 Placebarcode
returns 之后,CreateFormX
对返回的 rect 执行 SetBBox()
,在我看来,这对于每个 moduleSize > 1 都太小了。
现在的问题是:我的分析是否错误,如果是,我该如何解决我的问题?
我目前的解决方法是直接调用PlaceBarcode
,然后或多或少地手动将条形码添加到页面。
此代码有效(而不是调用 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 );
相反。