2016-11-15 7 views
0

私はAmazonの出荷ラベルからリクエストしています。圧縮された "GZIP"ファイルの文字列を返信しています。これを ".gz"私はそれを解凍することができます(またはそれを抽出する)、時には "PNG"形式の文字列であり、いくつかは "PDF"形式です。 しかし、毎回「PNG」形式でプリントアウトしたいのですが、「PDF」形式を返信するときに、圧縮解除された(GZIPSTREAM)ファイルを「PNG」に変換することはできません! はサードパーティのライブラリをインストールしないと助けになりますか?"PDF"を "PNG"に変換します。C#

は、ここでは、ストリームの最初の4つのバイトを見て、PNGを検出することができますマイコード

public async Task PrintLabel(string imageLabelString) 
    { 
     var byteStream = Convert.FromBase64String(imageLabelString); 
     GZipStream gzip = null; 
     Image image = null; 
     using (MemoryStream memoryStream = new MemoryStream(byteStream)) 
     { 
      image = null; 
      //File.WriteAllBytes("temp.gz", byteStream); 
      using (gzip = new GZipStream(memoryStream, CompressionMode.Decompress)) 
      { 
       image = Image.FromStream(gzip); 
      }; 

      memoryStream.Position = 0; 


      image.RotateFlip(RotateFlipType.Rotate90FlipNone); 

      PrintDocument pd = new PrintDocument(); 
      pd.PrintPage += (object o, PrintPageEventArgs e) => 
      { 
       Rectangle rectangle = new Rectangle(0, 0, 500, 750); 
       e.Graphics.DrawImage(image, rectangle); 
      }; 

      pd.PrinterSettings.PrinterName = "PrinterName"; 
      pd.Print(); 
     } 
     this.Close(); 
    } 
+1

これは、第三者のライブラリなしでは自明ではありません。 * c#pdfの画像には多くのヒットがあります。* –

+0

最初の4バイトを確認して、デコードされたストリームがPNGであるかどうかを検出できます。 PNGには、文字列 "PNG"がASCIIで含まれます。 –

答えて

1

です。 PNGには簡単に検出できるマーカーがあります。不要な割り当てを避けるために、@ブラッドリーのソリューションを改善する

bool IsStreamPng(Stream s) 
{ 
    s.Seek(0, SeekOrigin.Begin); //Go to the start of the stream 
    var headerBytes = new byte[4]; //Create a buffer to hold 4 bytes of data 
    s.Read(headerBytes, 0, 4); //Copy 4 bytes of data to the buffer 

    var headerString = Encoding.ASCII.GetString(headerBytes); //convert the buffer to a string 
    return headerString.ToUpper().EndsWith("PNG"); //do the first 4 characters of the header end with "PNG"? 
} 

https://www.w3.org/TR/PNG/#5PNG-file-signature

+0

お返事ありがとうございます! しかし、難しいのは、それが "PDF"であることがわかっていても、私はまだ "PDFストリーム"をPNGストリームに変換できないので、画像として印刷することができます!どんな解決策ですか? ありがとう! – cmark

+0

ああ、申し訳ありませんが、私はあなたの質問を誤解しました。私はあなたがPNGを表示したかったと思って、それらを検出する方法が必要でした。残念ながら、私はサードパーティのライブラリがないPDFをイメージに変換する方法については知らない。 –

+0

ありがとうとにかくそれはまた非常に便利です! – cmark

0

...:

PNGファイルの最初の8つのバイトは常に次が含まれているhttp://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html

から(小)値:

137 80 78 71 13 10 26 10 
public static Boolean IsPng(Stream stream) { 

    // assuming stream is at position 0 

    return 
     stream.ReadByte() == 137 && 
     stream.ReadByte() == 80 && 
     stream.ReadByte() == 78 && 
     stream.ReadByte() == 71 && 
     stream.ReadByte() == 13 && 
     stream.ReadByte() == 10 && 
     stream.ReadByte() == 26 && 
     stream.ReadByte() == 10; 
} 
+0

お返事ありがとうございます!私は@ブラッドリーの難しいことを言ったように私はそれが "PDFまたはPNG"でも私はまだ "PDFストリーム"をPNGストリームに変換できないので、私は画像としてそれを印刷することができます!どんな解決策ですか?ありがとう! – cmark

+0

@cmark PDFレンダリングライブラリを使用します。 https://www.google.com/search?q=pdf+rendering+library – Dai

関連する問題