1+ package info.nukoneko.kidspos.server.service
2+
3+ import com.google.zxing.BarcodeFormat
4+ import com.google.zxing.EncodeHintType
5+ import com.google.zxing.WriterException
6+ import com.google.zxing.client.j2se.MatrixToImageWriter
7+ import com.google.zxing.qrcode.QRCodeWriter
8+ import com.itextpdf.io.image.ImageDataFactory
9+ import com.itextpdf.kernel.geom.PageSize
10+ import com.itextpdf.kernel.pdf.PdfDocument
11+ import com.itextpdf.kernel.pdf.PdfWriter
12+ import com.itextpdf.layout.Document
13+ import com.itextpdf.layout.element.Image
14+ import com.itextpdf.layout.element.Paragraph
15+ import com.itextpdf.layout.element.Table
16+ import com.itextpdf.layout.properties.TextAlignment
17+ import com.itextpdf.layout.properties.UnitValue
18+ import info.nukoneko.kidspos.server.entity.ItemEntity
19+ import org.springframework.stereotype.Service
20+ import java.io.ByteArrayOutputStream
21+ import java.util.*
22+
23+ @Service
24+ class BarcodeService {
25+
26+ fun generateBarcodePdf (items : List <ItemEntity >): ByteArray {
27+ val outputStream = ByteArrayOutputStream ()
28+ val writer = PdfWriter (outputStream)
29+ val pdf = PdfDocument (writer)
30+ val document = Document (pdf, PageSize .A4 )
31+
32+ document.setMargins(20f , 20f , 20f , 20f )
33+
34+ val title = Paragraph (" 商品バーコード一覧" )
35+ .setFontSize(18f )
36+ .setTextAlignment(TextAlignment .CENTER )
37+ .setMarginBottom(20f )
38+ document.add(title)
39+
40+ val table = Table (UnitValue .createPercentArray(floatArrayOf(1f , 2f , 2f )))
41+ .setWidth(UnitValue .createPercentValue(100f ))
42+
43+ for (item in items) {
44+ val barcodeImage = generateQRCode(item.barcode)
45+
46+ table.addCell(
47+ Paragraph (item.id.toString())
48+ .setTextAlignment(TextAlignment .CENTER )
49+ )
50+
51+ if (barcodeImage != null ) {
52+ table.addCell(Image (ImageDataFactory .create(barcodeImage))
53+ .setWidth(100f )
54+ .setHeight(100f ))
55+ } else {
56+ table.addCell(Paragraph (" QRコード生成エラー" ))
57+ }
58+
59+ table.addCell(
60+ Paragraph (" ${item.name} \n ¥${item.price} " )
61+ .setTextAlignment(TextAlignment .LEFT )
62+ )
63+ }
64+
65+ document.add(table)
66+ document.close()
67+
68+ return outputStream.toByteArray()
69+ }
70+
71+ private fun generateQRCode (content : String ): ByteArray? {
72+ return try {
73+ val qrCodeWriter = QRCodeWriter ()
74+ val hints = EnumMap <EncodeHintType , Any >(EncodeHintType ::class .java)
75+ hints[EncodeHintType .CHARACTER_SET ] = " UTF-8"
76+ hints[EncodeHintType .MARGIN ] = 2
77+
78+ val bitMatrix = qrCodeWriter.encode(content, BarcodeFormat .QR_CODE , 200 , 200 , hints)
79+ val outputStream = ByteArrayOutputStream ()
80+ MatrixToImageWriter .writeToStream(bitMatrix, " PNG" , outputStream)
81+ outputStream.toByteArray()
82+ } catch (e: WriterException ) {
83+ null
84+ }
85+ }
86+ }
0 commit comments