Изменение размера модуля в BarcodeDataMatrx обрезает изображение кода - PullRequest
0 голосов
/ 28 февраля 2019

Я добавляю BarcodeDataMatrix в существующий документ PDF.Поскольку этот документ обрабатывается автоматически, размер каждого модуля должен соответствовать спецификации автоматизации (которая выше, чем сгенерированная по умолчанию).

Это можно сделать с помощью barcode.CreateFormX((Canvas)null, moduleSize, pdfDocument), где moduleSize - эточисло, которое влияет на размер каждой точки в коде.

Проблема, с которой я сталкиваюсь, заключается в следующем: всякий раз, когда я устанавливаю moduleSize> 1, код обрезается, то есть части сверху и справа отсутствуют.

Когда я посмотрел в источник, я обнаружил это :

        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 [единиц].Однако он возвращает прямоугольник с размером штрих-кода в количестве модулей.Это означает, что для каждого значения moduleSize> 1 возвращаемый прямоугольник слишком мал.И после возврата Placebarcode, CreateFormX делает SetBBox() с возвращенным прямоугольником, что, по моему мнению, для каждого moduleSize> 1 слишком мало.

Теперь вопрос: мой анализ неверен, и еслиИтак, как я могу решить свои проблемы?

Мой подход к решению этой проблемы на данный момент заключается в прямом вызове PlaceBarcode и добавлении штрих-кода более или менее вручную на страницу.

1 Ответ

0 голосов
/ 28 февраля 2019

Этот код работает (вместо вызова 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 );

.

...