【问题标题】:How to generate PDF one page one row from datatable using iTextSharp如何使用 iTextSharp 从数据表中生成 PDF 一页一行
【发布时间】:2021-11-11 08:34:45
【问题描述】:

我创建了一个 webforms 页面,该页面发布了许多 qr 凭证代码,我想要的是我可以从我拥有的数据库中一页一页地打印凭证。这是我尝试制作的代码

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

我的代码遇到的问题是代码不会生成多个页面。它只产生一页,数据是我表的第一行。我使用 iTextSharp 生成 PDF。

你的回答会很有帮助。谢谢

【问题讨论】:

  • 您可以尝试删除最后一个 response.End()。这将终止代码异常并完成到服务器的页面往返。通过注释掉那一行来查看它是否有效。
  • 哇,谢谢,我去试试

标签: asp.net vb.net webforms


【解决方案1】:

下面展示了如何使用 NuGet 包 iTextSharpQRCoder 创建每页有一个二维码的 PDF 文档。大部分代码来自 OP,但是需要重新排列。我添加了代码以允许指定 QR 码的大小。包含用于测试的代码。

以下假设您使用的是 VB.NET ASP.NET Web Application (.NET Framework) 项目。为了测试,我使用了Empty 项目模板。在“添加文件夹和核心引用”下,我检查了 Web 表单。在“高级”下,我取消选中 为 HTTPS 配置

打开解决方案资源管理器

  • 在VS菜单中,点击查看
  • 选择解决方案资源管理器

下载/安装 NuGet 包

  • 在解决方案资源管理器中,右键单击
  • 选择管理 NuGet 包...
  • 点击浏览
  • 搜索:QRCoder
  • 选择所需版本(例如:1.4.1)
  • 点击安装
  • 搜索:iTextSharp
  • 选择所需版本(例如:5.5.13.2)
  • 点击安装

添加网络表单(名称:default.aspx)

  • 在VS菜单中,点击Project
  • 选择添加新项目...
  • 选择Web 表单(名称:default.aspx)
  • 点击添加

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>

修改 default.aspx.vb

  • 在解决方案资源管理器中,右键单击 default.aspx 并选择 查看代码

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

注意:您需要将“CreateTestData”函数替换为检索数据的函数。

资源

【讨论】:

  • 哇!非常感谢,它有效!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2012-10-13
  • 1970-01-01
  • 2011-03-24
相关资源
最近更新 更多