2012-07-05 21 views
5

QRコードをPDFファイルから読み取る必要があります。私は思考法を使用しています。画像を受け取り、QRコードに保持されているデータを返すQRコード。私はその部分が働いている。QRコードを読むためにPDFを一時的に画像に変換する

しかし、私は複数ページのPDFファイルを受け入れ、各ページを画像としてQRリーダーに送る必要があります。元のPDFの各ページを、QRコードに含まれるデータの名前にちなんだ単一ページのPDFとして保存する必要があります。

このプロジェクトではどのライブラリを使用することをおすすめしますか?私が見た多くのものが恒久的なイメージを作り出していますが、私は一時的なものをほしいだけです。私にこれを簡単に許可するものがありますか? pdfを読むことができる別のQRリーダーがありますか?

アドバイスをいただきありがとうございます。

答えて

5

私はitextsharpとlibtiff.NETを使用して、PDFファイルからtiffイメージをメモリに抽出しました。一番下の行は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 
関連する問題