【问题标题】:How do I adjust the size of dots when generating QR Codes in itext7?在itext7中生成二维码时如何调整点的大小?
【发布时间】:2021-08-12 08:39:12
【问题描述】:

我在使用 itext7 时有一个问题。我想通过生成二维码来生成pdf。 正常创建没有问题。但是,我想调整 QR 点的大小。 我不想减小 QR 码的整体大小,我只想减小其中的点的大小。 目前只能调整二维码的整体大小。

public class PdfTest {

    public static final String DEST = "D:\\output.pdf";
    public static final String SRC = "D:\\202106003196.pdf";

    static PdfDocument mPdfDocument;
    
    public static void main(String[] args) {

        try {

            File file = new File(DEST);
            file.getParentFile().mkdirs();
    
            FontProgramFactory.registerFont("D:\\font\\MAISONNEUEEXT-MEDIUM.OTF", "MAISONNEUEEXT-MEDIUM");
            PdfFont mPdfFont_MAISONNEUEEX_MEDIUM = PdfFontFactory.createRegisteredFont("MAISONNEUEEXT-MEDIUM");

            mPdfDocument = new PdfDocument(new PdfReader(SRC), new PdfWriter(DEST));

            Document mDocument = new Document(mPdfDocument);
            
            // QR
            addQR("HTTP://QR.TEST.COM/0123456", mPdfDocument, 1, 25, 50);
            
            PdfPage pdfPage = mPdfDocument.getPage(1);

            Rectangle pageSize = pdfPage.getPageSize();
            Rectangle[] mRectangle = {new Rectangle(0, 10, pageSize.getRight(), 50)};
            mDocument.setRenderer(new ColumnDocumentRenderer(mDocument, mRectangle));

            mDocument.close();
            mPdfDocument.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private static void addQR(String mQRCode, PdfDocument mPdfDocument, int mPage, float mX, float mY) {

        PdfPage mPdfPage = mPdfDocument.getPage(mPage);
        BarcodeQRCode mBarcodeQRCode;
        Map<EncodeHintType, Object> mHints = new HashMap<>();
        mHints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        mHints.put(EncodeHintType.MIN_VERSION_NR, 2);
        mBarcodeQRCode = new BarcodeQRCode(mQRCode, mHints);
        
        PdfCanvas over = new PdfCanvas(mPdfPage);

        mBarcodeQRCode.placeBarcode(over, ColorConstants.RED, 0.5f);
    }
}

enter image description here

【问题讨论】:

  • 您好,您共享了一个方法声明。如何(使用哪些参数)调用此方法来重现问题?
  • @AlexeySubach 你好,我修改了上面的源码。我带回了完整的源代码。上面的源代码不会产生错误。我想要的是减小二维码中点的大小。

标签: java itext itext7


【解决方案1】:

点的大小由 QR 算法本身定义,取决于内容的长度。让我修改你的代码来演示一下。

在下面的 sn-p 中,我们将添加 10 个 QR 码:第一个将代表一个“Lorem ipsum”句子,最后一个 - 10 个句子。

@Test
public void barcodesTest() throws FileNotFoundException {
    PdfDocument pdfDocument = new PdfDocument(new PdfWriter(destinationFolder + "barcodes.pdf"));

    String text = "Lorem ipsum dolor sit amet";
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < 10; i++) {
        pdfDocument.addNewPage();
        builder.append(text);
        addQR(builder.toString(), pdfDocument, i+1);
    }

    pdfDocument.close();
}

private static void addQR(String text, PdfDocument pdfDoc, int pageNumber) {
    PdfPage page = pdfDoc.getPage(pageNumber);

    Map<EncodeHintType, Object> mHints = new HashMap<>();
    mHints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
    mHints.put(EncodeHintType.MIN_VERSION_NR, 2);

    BarcodeQRCode qrCode = new BarcodeQRCode(text, mHints);

    PdfCanvas over = new PdfCanvas(page);
    // 12 is passed to make the qr code appear big
    qrCode.placeBarcode(over, ColorConstants.RED, 12);
}

如果我们比较条形码,我们会看到点的大小逐页逐渐减小(实际上,最后一页的条形码是如此巨大,以至于它占用的空间远远超过页面本身): 第一页: 最后一页:

【讨论】:

  • 感谢您的回复。但是我的问题的意思是:二维码数据是一样的,只是点的大小不同。请检查我另外附上的比较图像。谢谢
  • 右边的图片不是比左边的图片窄一点吗?如果是这种情况,那么您将 `qrCode.placeBarcode(over, ColorConstants.RED, 12);`中的第三个参数减少一点。
  • 如果调整'111'的第三因子的大小,则调整整个QR的大小。我只想调整点的大小而不改变整个 QR 的大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 2017-01-05
相关资源
最近更新 更多