0

I created a webforms page that issued many qr voucher codes, what I want is that I can print the vouchers one by one page from the database I have. here's the code I've tried to make

Private Sub MySub(Param As String)
        Try
            Dim obj As New ReportObjects
            Dim dt0 As New DataTable
            Dim ds As New DataSet
            ds = obj.MyStoredProcedure(Param)
            obj.Dispose()
            dt0 = ds.Tables(0)
            obj.Dispose()
            dt0.Dispose()
            ds.Dispose()

            For i As Integer = 0 To dt0.Rows.Count - 1
                Dim qrGenerator As QRCodeGenerator = New QRCodeGenerator()
                Dim qrCode As QRCodeGenerator.QRCode = qrGenerator.CreateQrCode(dt0.Rows(i).Item("VoucherNo"), QRCodeGenerator.ECCLevel.Q)
                Using bitMap As Bitmap = qrCode.GetGraphic(20)
                    Using ms As MemoryStream = New MemoryStream()
                        bitMap.Save(ms, System.Drawing.Imaging.ImageFormat.Png)
                        byteImage = ms.ToArray()
                    End Using
                End Using

                Dim base64 As String = Convert.ToBase64String(byteImage)
                Dim imageBytes As Byte() = Convert.FromBase64String(base64)
                Dim image As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(imageBytes)
                Using memoryStream As System.IO.MemoryStream = New System.IO.MemoryStream()
                    Dim document As Document = New Document(PageSize.A4, 1.0F, 1.0F, 1.0F, 1.0F)
                    Dim writer As PdfWriter = PdfWriter.GetInstance(document, memoryStream)
                    document.Open()
                    document.NewPage()
                    document.Add(image)
                    document.Add(New Phrase("Valid From : " & dt0.Rows(i).Item("StartDT").ToString() & " To " & dt0.Rows(i).Item("EndDT").ToString()))
                    document.Close()
                    Dim bytes As Byte() = memoryStream.ToArray()
                    memoryStream.Close()
                    Response.Clear()
                    Response.ContentType = "application/pdf"
                    Response.AddHeader("Content-Disposition", "attachment; filename=Image.pdf")
                    Response.ContentType = "application/pdf"
                    Response.Buffer = True
                    Response.Cache.SetCacheability(HttpCacheability.NoCache)
                    Response.BinaryWrite(bytes)
                    Response.End()
                End Using
            Next

        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
    End Sub

The problem I encountered with my code is the code doesn't produce multiple pages. It produce just 1 page and the data is the first row of my table. I used iTextSharp for generating PDF.

Your answer will be so helpful. Thank you

Arya
  • 21
  • 1
  • 7

1 Answers1

1

The following shows how to create a PDF document that has one QR code per page using NuGet packages iTextSharp and QRCoder. Most of the code is from the OP, however it needed to be rearranged. I added code to allow the size of the QR code to be specified. The code used for testing is included.

The following assumes that you're using a VB.NET ASP.NET Web Application (.NET Framework) project. For testing, I used the Empty project template. Under "Add folders & core references", I checked Web Forms. Under "Advanced", I unchecked Configure for HTTPS.

Open Solution Explorer

  • In VS menu, click View
  • Select Solution Explorer

Download/install NuGet packages:

  • In Solution Explorer, right-click <solution name>
  • Select Manage NuGet Packages...
  • Click Browse
  • Search: QRCoder
  • Select desired version (ex: 1.4.1)
  • Click Install
  • Search: iTextSharp
  • Select desired version (ex: 5.5.13.2)
  • Click Install

Add Webform (name: default.aspx)

  • In VS menu, click Project
  • Select Add New Item...
  • Select Web Form (name: default.aspx)
  • Click Add

default.aspx

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="default.aspx.vb" Inherits="WebApplicationArya._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button runat="server" id="btnCreateQRCode" Text="Create QRCode" Onclick="btnCreateQRCode_Click" />
        </div>
    </form>
</body>
</html>

Modify default.aspx.vb

  • In Solution Explorer, right-click default.aspx and select View Code

default.aspx.vb

Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports QRCoder


Public Class _default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    End Sub

    Private Function CreateTestData() As DataTable
        Dim dt0 As New DataTable

        'for testing
        dt0.Columns.Add("VoucherNo", System.Type.GetType("System.Int32"))
        dt0.Columns.Add("StartDT", System.Type.GetType("System.DateTime"))
        dt0.Columns.Add("EndDT", System.Type.GetType("System.DateTime"))

        Dim dr As DataRow

        For i As Integer = 0 To 6 Step 1
            'create new row
            dr = dt0.NewRow()
            dr("VoucherNo") = "123" & i.ToString()
            dr("StartDT") = DateTime.Now
            dr("EndDT") = DateTime.Now.AddDays(30)

            'add
            dt0.Rows.Add(dr)
        Next

        Return dt0
    End Function

    Private Sub CreatePdf(dt0 As DataTable, Optional qrCodeSize As Single = 150.0F)
        Dim pdfBytes As Byte() = Nothing
        'Dim writer As PdfWriter = Nothing

        Try
            Using memoryStream As System.IO.MemoryStream = New System.IO.MemoryStream()
                Using document As Document = New Document(PageSize.A4, 1.0F, 1.0F, 1.0F, 1.0F)

                    Using writer As PdfWriter = PdfWriter.GetInstance(document, memoryStream)
                        'open
                        document.Open()

                        'create new PDF page for each QRCode
                        For i As Integer = 0 To dt0.Rows.Count - 1 Step 1
                            Dim byteImage As Byte()
                            Dim qrGenerator As QRCodeGenerator = New QRCodeGenerator()

                            'create QRCode for each VoucherNo in DataTable
                            Dim qrGenerator1 As QRCodeGenerator = New QRCodeGenerator()
                            Dim qrCodeData1 As QRCodeData = qrGenerator1.CreateQrCode(dt0.Rows(i).Item("VoucherNo"), QRCodeGenerator.ECCLevel.Q)
                            Dim qrCode1 As QRCode = New QRCode(qrCodeData1)
                            Using bitMap As System.Drawing.Bitmap = qrCode1.GetGraphic(20)
                                Using ms As System.IO.MemoryStream = New System.IO.MemoryStream()
                                    bitMap.Save(ms, System.Drawing.Imaging.ImageFormat.Png)
                                    byteImage = ms.ToArray()
                                End Using
                            End Using

                            Dim image As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(byteImage)

                            'Dim base64 As String = Convert.ToBase64String(byteImage)
                            'Dim imageBytes As Byte() = Convert.FromBase64String(base64)
                            'Dim image As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(imageBytes)

                            'set size
                            'image.ScaleAbsolute(200.0F, 200.0F)

                            'ex: 200.0F, 200.0F
                            image.ScaleAbsolute(qrCodeSize, qrCodeSize)

                            'add new page
                            document.NewPage()

                            'add QRCode image
                            document.Add(image)

                            'add text
                            document.Add(New Phrase("Valid From : " & dt0.Rows(i).Item("StartDT").ToString() & " To " & dt0.Rows(i).Item("EndDT").ToString() & " (image" & i.ToString() & ")"))
                        Next

                        'close
                        document.Close()

                        'convert PDF to byte()
                        pdfBytes = memoryStream.ToArray()
                    End Using
                End Using
            End Using

            'send data
            SendData(pdfBytes)

        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
    End Sub

    Private Sub SendData(pdfBytes As Byte())
        Response.Clear()
        Response.ContentType = "application/pdf"
        Response.AddHeader("Content-Disposition", "attachment; filename=Image.pdf")
        Response.ContentType = "application/pdf"
        Response.Buffer = True
        Response.Cache.SetCacheability(HttpCacheability.NoCache)
        Response.BinaryWrite(pdfBytes)
        'Response.End()
    End Sub

    Protected Sub btnCreateQRCode_Click(sender As Object, e As EventArgs)
        'ToDo: Replace "CreateTestData" with function to retrieve data

        'get test data
        Dim dt0 As DataTable = CreateTestData()

        'create PDF containing QRCodes
        'CreatePdf(dt0)

        'create PDF; set size for QR codes
        CreatePdf(dt0, 100.0F)
    End Sub
End Class

Note: You'll need to replace the "CreateTestData" function with a function that retrieves your data.

Resources:

Tu deschizi eu inchid
  • 4,117
  • 3
  • 13
  • 24