2016-11-15 5 views
0

Ich bin amazon Lieferung Versand Etiketten, und sie senden eine Zeichenfolge, die eine komprimierte "GZIP" -Datei ist, und ich muss es als ". GZ" -Erweiterung speichern und dann kann ich es dekomprimieren (oder extrahieren), manchmal ist die Zeichenfolge in einem "PNG" -Format und einige ist es ein "PDF" -Format! Aber ich möchte jedes Mal in einem "PNG" -Format drucken, aber ich kann die dekomprimierte (GZIPSTREAM) Datei nicht in ein "PNG" umwandeln, wenn sie ein "PDF" -Format zurücksenden! ist keine Hilfe, ohne Drittanbieterbibliotheken zu installieren?Convert "PDF" dekomprimiert GZipStream in "PNG" C#

Hier ist mein Code

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

Dies ist ohne eine 3rd-Party-Bibliothek nicht trivial. Es gibt viele Treffer für * C# pdf zu image * –

+0

Sie können feststellen, ob der decodierte Stream ein PNG ist, indem Sie die ersten 4 Bytes überprüfen. In einem PNG enthalten sie die Zeichenfolge "PNG" in ASCII. –

Antwort

1

Sie eine PNG, indem man die ersten 4 Bytes des Stroms erkennen kann. PNGs haben einen Marker, der leicht erkannt werden kann.

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

Danke für die Antwort! Aber das Schwierige ist, dass selbst ich weiß, dass es ein "PDF" ist. Ich kann meinen "PDF-Stream" immer noch nicht in einen PNG-Stream konvertieren, damit ich ihn als Bild ausdrucken kann! Irgendeine Lösungsmöglichkeit? Danke! – cmark

+0

Ahhh, Entschuldigung, ich habe deine Frage missverstanden. Ich dachte, Sie wollten nur PNG anzeigen und brauchten einen Weg, sie zu erkennen. Leider kenne ich keine Möglichkeit, ein PDF ohne Bibliotheken von Drittanbietern in ein Bild zu konvertieren. –

+0

Danke trotzdem, es ist auch sehr nützlich! – cmark

0

... auf @ Bradley-Lösung zu verbessern unnötige Zuweisungen zu vermeiden:

Von http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html

Die ersten acht Bytes einer PNG-Datei enthält immer die folgenden (Dezimal) Werte:

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

Vielen Dank für Ihre Antwort! aber wieder, wie ich sagte @ Bradley ist die harte Sache ist, dass sogar ich weiß, es ist ein "PDF oder PNG" Ich kann immer noch nicht meinen "PDF-Stream" in einen PNG-Stream konvertieren, so dass ich es als Bild ausdrucken kann! Irgendeine Lösungsmöglichkeit? Vielen Dank! – cmark

+0

@cmark Verwenden Sie eine PDF-Rendering-Bibliothek. https://www.google.com/search?q=pdf+render+library – Dai