简体   繁体   English

如何使用 IText7 创建 QR 码的示例

[英]Example for how to create QR Code with IText7

I'm looking for an example of how to create a QR Code using IText7.我正在寻找如何使用 IText7 创建 QR 码的示例。 I see examples for IText5 that no longer apply.我看到不再适用的 IText5 示例。 I was able to do this quite easily using the ZXing library combined with IText but since we already have IText I was hoping not to have to add another library.我可以很容易地使用 ZXing 库和 IText 来做到这一点,但由于我们已经有了 IText,我希望不必添加另一个库。

In case it helps someone else, here is the code using ZXing and IText7.如果它对其他人有帮助,这里是使用 ZXing 和 IText7 的代码。

    File file = new File("qrCodeTest.pdf");

    // Create PDF with IText7
    PdfWriter pdfWriter = new PdfWriter(file);
    PdfDocument pdfDocument = new PdfDocument(pdfWriter);

    Document document = new Document(pdfDocument);

    // Use ZXing to create the QR Code
    ByteArrayOutputStream baos = generateEAN13BarcodeImageBytes("some text");
    // Convert ZXing output to IText Image to add to PDF
    byte[] bytes = baos.toByteArray();
    ImageData imageData = ImageDataFactory.create(bytes);
    Image pdfImg = new Image(imageData);

    document.add(pdfImg);
    document.close();
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.UUID;

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class BarcodeService {

    private final OrderItemRepository orderItemRepository;
    private final OrderRepository orderRepository;
    private final BarcodeHistoryRepository barcodeHistoryRepository;

    @Transactional
    public byte[] getBarcodeForOrderItem(UUID orderItemId, Integer appId) throws WriterException, IOException {
        Optional<OrderItem> orderItemOptional = orderItemRepository.findById(orderItemId);
        if(!orderItemOptional.isPresent())
            throw new NoSuchElementException("OrderItem not found: " + orderItemId);
        BarcodeHistory barcodeHistory = BarcodeHistory.builder().build();
        barcodeHistory.setAppId(appId);
        barcodeHistory = barcodeHistoryRepository.save(barcodeHistory);
        OrderItem orderItem = orderItemOptional.get();
        QRCodeWriter writer = new QRCodeWriter();
        BitMatrix matrix = writer.encode(orderItem.getId() + ","
                + orderItem.getSkuId() + "," + orderItem.getQuantity() + "," + orderItem.getSpjOrder().getCustomerId()
                + "," + barcodeHistory.getToken(),
                BarcodeFormat.QR_CODE, 350, 350);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(matrix, "JPG", outputStream);
        return outputStream.toByteArray();
    }

    @Transactional
    public byte[] getBarcodeForOrder(UUID orderId, Integer appId) throws WriterException, IOException {
        Optional<Order> orderOptional = orderRepository.findById(orderId);
        if(!orderOptional.isPresent())
            throw new NoSuchElementException("Order not found: " + orderId);
        BarcodeHistory barcodeHistory = BarcodeHistory.builder().build();
        barcodeHistory.setAppId(appId);
        barcodeHistory = barcodeHistoryRepository.save(barcodeHistory);
        Order order = orderOptional.get();
        QRCodeWriter writer = new QRCodeWriter();
        BitMatrix matrix = writer.encode(order.getId() + ","
                        + order.getCustomerId() + "," + barcodeHistory.getToken(),
                BarcodeFormat.QR_CODE, 350, 350);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(matrix, "JPG", outputStream);
        return outputStream.toByteArray();
    }
}

Here is an example using only IText7这是一个仅使用 IText7 的示例

    File file = new File("qrCodeExample.pdf");
    PdfWriter writer = new PdfWriter(file);
    PdfDocument pdfDoc = new PdfDocument(writer);
    Document document = new Document(pdfDoc);
    BarcodeQRCode qrCode = new BarcodeQRCode("Example QR Code Creation in iText7");
    PdfFormXObject barcodeObject = qrCode.createFormXObject(ColorConstants.BLACK, pdfDoc);
    Image barcodeImage = new Image(barcodeObject).setWidth(100f).setHeight(100f);
    document.add(new Paragraph().add(barcodeImage));
    document.close();

With iText7 , it's easy to create and add the QRCode .使用iText7 ,可以轻松创建和添加QRCode The following code do the same.下面的代码做同样的事情。

import java.io.IOException;
import com.itextpdf.barcodes.BarcodeQRCode;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.WriterProperties;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Image;

public class QRCodeGenerator {
  
  public static final String SRC = "document.pdf";
  public static final String DEST = "document_out.pdf";
  
  public static void main(String[] args) throws IOException {
    String url = "https://itextpdf.com/";
    
    PdfReader reader = new PdfReader(SRC);
    PdfWriter writer = new PdfWriter(DEST, new WriterProperties());
    PdfDocument pdfDocument = new PdfDocument(reader, writer);
    
    // Adding QRCode to first page
    PdfPage pdfPage = pdfDocument.getFirstPage();
    PdfCanvas pdfCanvas = new PdfCanvas(pdfPage);
    Rectangle rect = new Rectangle(100, 600, 100, 100);
    
    BarcodeQRCode barcodeQRCode = new BarcodeQRCode(url);
    PdfFormXObject pdfFormXObject =
        barcodeQRCode.createFormXObject(ColorConstants.BLACK, pdfDocument);
    Image qrCodeImage =
        new Image(pdfFormXObject).setWidth(rect.getWidth()).setHeight(rect.getHeight());
    
    Canvas qrCanvas = new Canvas(pdfCanvas, rect);
    qrCanvas.add(qrCodeImage);
    qrCanvas.close();
    
    pdfDocument.close();
  }
  
}

The iText7 version 7.2.3 is in used and the following dependencies are required:正在使用iText7版本7.2.3 ,需要以下依赖项:

<properties>
    <itext.version>7.2.3</itext.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>kernel</artifactId>
        <version>${itext.version}</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>barcodes</artifactId>
        <version>${itext.version}</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>io</artifactId>
        <version>${itext.version}</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>layout</artifactId>
        <version>${itext.version}</version>
    </dependency>
</dependencies>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM