【问题标题】:itextsharp pdfsmartcopy only returning last pageitextsharp pdfsmartcopy 只返回最后一页
【发布时间】:2014-10-07 02:16:47
【问题描述】:

我遇到了一个问题,即只存储了我的 pdf 的最后一页。

pdf 应该是多页长,如果我只是使用 Response 和 mms 内存流将 pdf 发送到浏览器,这可以正常工作,但是我需要将它作为 pdf 添加到电子邮件中,因此正在将 mms 写入创建电子邮件附件时创建新内存流的字节。这是为了绕过关闭的流错误。

这是我的代码

 Public Shared Function SendPrePackLabels(ByVal bf_id As String, mail As String) As Boolean
        Dim pars(0) As SqlParameter
        pars(0) = New SqlParameter("@bf_id", SqlDbType.VarChar) With {.Value = bf_id}

        Dim p As String
        Dim reader As PdfReader
        Dim mms As New MemoryStream

        Dim rt() As Byte
        Dim i As Integer = 0

        Using dc As Document = New Document
            Using sc As PdfSmartCopy = New PdfSmartCopy(dc, System.Web.HttpContext.Current.Response.OutputStream)
                dc.Open()
                With SqlHelper.ExecuteDataset(Stiletto.cnStrRMIS, CommandType.StoredProcedure, "BPM_spPrepack_Labels", pars).Tables(0)
                    For Each dr As DataRow In .Rows
                        Dim pdfr As New PdfReader("http://192.168.0.221/template.pdf")
                        Using ms As New MemoryStream
                            Using pdfs As New PdfStamper(pdfr, ms)
                                Dim fields As AcroFields = pdfs.AcroFields
                                fields.GenerateAppearances = True
                                fields.SetField("pono", dr.Item("po_no").ToString)
                                fields.SetField("ref", dr.Item("alt_code").ToString)
                                fields.SetField("colour", dr.Item("colour").ToString)
                                fields.SetField("code", dr.Item("sizerun_hdr_id").ToString)

                                For k As Integer = 1 To dr.Table.Columns.Count - 6
                                    Dim j As Integer = k + 5
                                    fields.SetField("s" & k, dr.Table.Columns(j).ColumnName.ToString)
                                    If dr.Item(dr.Table.Columns(j).ColumnName.ToString).ToString = "" Then
                                        p = "0"
                                    Else
                                        p = dr.Item(dr.Table.Columns(j).ColumnName.ToString).ToString
                                    End If
                                    fields.SetField("p" & k, p)
                                Next
                                fields.SetField("pack", dr.Item("sizerun_hdr_id").ToString)
                                Dim bcfont As BaseFont = BaseFont.CreateFont("http://192.168.0.221/ean.ttf", BaseFont.CP1252, BaseFont.EMBEDDED)
                                fields.SetFieldProperty("barcode", "textfont", bcfont, Nothing)
                                fields.SetFieldProperty("barcode", "textsize", 60.0F, Nothing)


                                Dim mBarcode As String = "219" & dr.Item("sizerun_hdr_id").ToString
                                Dim cLength As Integer = mBarcode.Length

                                Dim zerostoadd As Integer = 12 - cLength
                                Dim digit12barcode As String = mBarcode.PadRight(12, CChar("0"))
                                Dim FinalBarcode As String = returnCheckDigitedBarcode(digit12barcode)
                                fields.SetField("barcode", FinalBarcode)


                                Dim par(1) As SqlParameter
                                par(0) = New SqlParameter("@sizerun_hdr_id", SqlDbType.VarChar) With {.Value = dr.Item("sizerun_hdr_id").ToString}
                                par(1) = New SqlParameter("@ean13", SqlDbType.VarChar) With {.Value = FinalBarcode}

                                SqlHelper.ExecuteScalar(Stiletto.cnStrRMIS, CommandType.StoredProcedure, "BPM_spSizeRunEAN13", par)
                                pdfs.FormFlattening = True
                                ms.Flush()
                            End Using
                            reader = New PdfReader(ms.ToArray)
                            sc.AddPage(sc.GetImportedPage(reader, 1))
                            mms = ms
                        End Using
                    Next
                End With
            End Using
        End Using

        Dim bt() As Byte = mms.ToArray

        Try
            If mail.Length > 0 Then
                Dim eMsg As New MailMessage()

                eMsg.From = New MailAddress("myemail@mydomain.co.uk")
                eMsg.To.Add(New MailAddress(mail))


                Dim title As String = "<h3>Here are the Prepack Labels.</h3>"

                eMsg.Subject = "Prepack Labels"
                eMsg.Body = "<html>" & title & "</html>"
                eMsg.IsBodyHtml = True

                Dim att As Attachment = New Attachment(New MemoryStream(bt), "Prepack Labels.pdf", "application/pdf")
                eMsg.Attachments.Add(att)

                Dim SMTP1 As New SmtpClient
                SMTP1.Host = "EX"
                SMTP1.Send(eMsg)

                att.Dispose()
            End If
            Return True
        Catch ex As Exception
            Return False
        End Try
       End Function

【问题讨论】:

    标签: asp.net pdf itextsharp memorystream pdfstamper


    【解决方案1】:

    我不确定您的确切问题,但我敢肯定,如果您将巨大的功能分解为只做一件事的更小更具体的功能,您的生活会更轻松。另外,我真的建议您在创建 PDF 之前不要写入原始 ASP.Net 流。相反,请始终写信给MemoryStream,获取字节并对它们进行处理。

    下面的代码将它分成四个函数。 CreatePdf() 循环访问数据库并为表中的每一行调用 CreateSinglePdf(),将它们与您的 PdfSmartCopy 合并。 SendEmail() 完全不知道 iTextSharp,只收到一个原始字节数组,假定为 PDF。这一切都是由SendPrePackLabels() 开始的,你可能还想Response.BinaryWrite() 你的字节。

    Public Shared Function SendPrePackLabels(ByVal bf_id As String, mail As String) As Boolean
        Dim bt = CreatePdf(bf_id)
        Return SendEmail(bt, mail)
    End Function
    Public Shared Function CreateSinglePdf(dr As DataRow) As Byte()
        Using ms As New MemoryStream
            Using pdfr As New PdfReader("http://192.168.0.221/template.pdf")
                Using pdfs As New PdfStamper(pdfr, ms)
                    Dim fields As AcroFields = pdfs.AcroFields
                    fields.GenerateAppearances = True
                    fields.SetField("pono", dr.Item("po_no").ToString)
                    fields.SetField("ref", dr.Item("alt_code").ToString)
                    fields.SetField("colour", dr.Item("colour").ToString)
                    fields.SetField("code", dr.Item("sizerun_hdr_id").ToString)
    
                    Dim p As String
    
                    For k As Integer = 1 To dr.Table.Columns.Count - 6
                        Dim j As Integer = k + 5
                        fields.SetField("s" & k, dr.Table.Columns(j).ColumnName.ToString)
                        If dr.Item(dr.Table.Columns(j).ColumnName.ToString).ToString = "" Then
                            p = "0"
                        Else
                            p = dr.Item(dr.Table.Columns(j).ColumnName.ToString).ToString
                        End If
                        fields.SetField("p" & k, p)
                    Next
                    fields.SetField("pack", dr.Item("sizerun_hdr_id").ToString)
                    Dim bcfont As BaseFont = BaseFont.CreateFont("http://192.168.0.221/ean.ttf", BaseFont.CP1252, BaseFont.EMBEDDED)
                    fields.SetFieldProperty("barcode", "textfont", bcfont, Nothing)
                    fields.SetFieldProperty("barcode", "textsize", 60.0F, Nothing)
    
    
                    Dim mBarcode As String = "219" & dr.Item("sizerun_hdr_id").ToString
                    Dim cLength As Integer = mBarcode.Length
    
                    Dim zerostoadd As Integer = 12 - cLength
                    Dim digit12barcode As String = mBarcode.PadRight(12, CChar("0"))
                    Dim FinalBarcode As String = returnCheckDigitedBarcode(digit12barcode)
                    fields.SetField("barcode", FinalBarcode)
    
    
                    Dim par(1) As SqlParameter
                    par(0) = New SqlParameter("@sizerun_hdr_id", SqlDbType.VarChar) With {.Value = dr.Item("sizerun_hdr_id").ToString}
                    par(1) = New SqlParameter("@ean13", SqlDbType.VarChar) With {.Value = FinalBarcode}
    
                    SqlHelper.ExecuteScalar(Stiletto.cnStrRMIS, CommandType.StoredProcedure, "BPM_spSizeRunEAN13", par)
                    pdfs.FormFlattening = True
                End Using
            End Using
    
            Return ms.ToArray()
        End Using
    End Function
    Public Shared Function CreatePdf(ByVal bf_id As String) As Byte()
        Dim pars(0) As SqlParameter
        pars(0) = New SqlParameter("@bf_id", SqlDbType.VarChar) With {.Value = bf_id}
    
    
        Using ms As New System.IO.MemoryStream
            Using dc As Document = New Document
                Using sc As PdfSmartCopy = New PdfSmartCopy(dc, ms)
                    dc.Open()
                    With SqlHelper.ExecuteDataset(Stiletto.cnStrRMIS, CommandType.StoredProcedure, "BPM_spPrepack_Labels", pars).Tables(0)
                        For Each dr As DataRow In .Rows
    
                            Dim pageBytes = CreateSinglePdf(dr)
    
                            Using reader = New PdfReader(pageBytes)
                                sc.AddPage(sc.GetImportedPage(reader, 1))
                            End Using
                        Next
                    End With
                End Using
            End Using
    
            Return ms.ToArray()
        End Using
    End Function
    
    Public Shared Function SendEmail(bt As Byte(), mail As String) As Boolean
        Try
            If mail.Length > 0 Then
                Dim eMsg As New MailMessage()
    
                eMsg.From = New MailAddress("myemail@mydomain.co.uk")
                eMsg.To.Add(New MailAddress(mail))
    
    
                Dim title As String = "<h3>Here are the Prepack Labels.</h3>"
    
                eMsg.Subject = "Prepack Labels"
                eMsg.Body = "<html>" & title & "</html>"
                eMsg.IsBodyHtml = True
    
                Dim att As Attachment = New Attachment(New MemoryStream(bt), "Prepack Labels.pdf", "application/pdf")
                eMsg.Attachments.Add(att)
    
                Dim SMTP1 As New SmtpClient
                SMTP1.Host = "EX"
                SMTP1.Send(eMsg)
    
                att.Dispose()
            End If
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function
    

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多