5

我需要能够从 PDF 文件中读取二维码。我正在使用 thinkworks.QRCode,它接受图像并返回 QR 码中保存的数据。我有那部分工作。

但是,我需要能够接受多页 PDF 文件并将每一页作为图像发送到 QR 阅读器。然后,我需要将原始 PDF 的每一页保存为以 QR 码中包含的数据命名的单页 PDF。

你会推荐我在这个项目中使用什么库?我见过的许多作品都创建了永久图像,但我只想要临时图像。有什么东西可以让我轻松做到这一点吗?是否有另一个可以阅读 pdf 的 QR 阅读器?

感谢您提供的任何建议!

4

1 回答 1

5

我使用 itextsharp 和 libtiff.NET 将 tiff 图像从 PDF 文件提取到内存中。底线是 itextsharp 将允许您访问图像,但如果它们被编码,您需要自己进行编码或使用另一个库,这就是 libtiff.NET 的用武之地。

以下代码根据我提出的问题的答案进行了修改:PDF Add Text and Flatten

Private Shared Function ExtractImages(ByVal pdf As Byte()) As List(Of Byte())
    Dim images As New List(Of Byte())
    Dim reader As New PdfReader(pdf)

    If (reader IsNot Nothing) Then
        ' Loop through all of the references in the PDF.
        For refIndex = 0 To (reader.XrefSize - 1)
            ' Get the object.
            Dim obj = reader.GetPdfObject(refIndex)

            ' Make sure we have something and that it is a stream.
            If (obj IsNot Nothing) AndAlso obj.IsStream() Then
                ' Cast it to a dictionary object.
                Dim pdfDict = DirectCast(obj, iTextSharp.text.pdf.PdfDictionary)

                ' See if it has a subtype property that is set to /IMAGE.
                If pdfDict.Contains(iTextSharp.text.pdf.PdfName.SUBTYPE) AndAlso (pdfDict.Get(iTextSharp.text.pdf.PdfName.SUBTYPE).ToString() = iTextSharp.text.pdf.PdfName.IMAGE.ToString()) Then
                    ' Grab various properties of the image.
                    Dim filter = pdfDict.Get(iTextSharp.text.pdf.PdfName.FILTER).ToString()
                    Dim width = pdfDict.Get(iTextSharp.text.pdf.PdfName.WIDTH).ToString()
                    Dim height = pdfDict.Get(iTextSharp.text.pdf.PdfName.HEIGHT).ToString()
                    Dim bpp = pdfDict.Get(iTextSharp.text.pdf.PdfName.BITSPERCOMPONENT).ToString()

                    ' Grab the raw bytes of the image
                    Dim bytes = PdfReader.GetStreamBytesRaw(DirectCast(obj, PRStream))

                    ' Images can be encoded in various ways. 
                    ' All of our images are encoded with a single filter.
                    ' If there is a need to decode another filter, it will need to be added.
                    If (filter = iTextSharp.text.pdf.PdfName.CCITTFAXDECODE.ToString()) Then
                        Using ms = New MemoryStream()
                            Using tiff As Tiff = tiff.ClientOpen("memory", "w", ms, New TiffStream())
                                tiff.SetField(TiffTag.IMAGEWIDTH, width)
                                tiff.SetField(TiffTag.IMAGELENGTH, height)
                                tiff.SetField(TiffTag.COMPRESSION, Compression.CCITTFAX4)
                                tiff.SetField(TiffTag.BITSPERSAMPLE, bpp)
                                tiff.SetField(TiffTag.SAMPLESPERPIXEL, 1)

                                tiff.WriteRawStrip(0, bytes, bytes.Length)
                                tiff.Flush()
                                images.Add(ms.ToArray())
                                tiff.Close()
                            End Using
                        End Using
                    Else
                        Throw New NotImplementedException("Decoding this filter has not been implemented")
                    End If
                End If
            End If
        Next
    End If

    Return images
End Function
于 2012-07-05T16:31:11.080 回答