Wie extrahiere ich Bilder, die FlateDecoded sind (wie PNG) aus einem PDF-Dokument mit PDFSharp?So extrahieren Sie FlateDecoded Images aus PDF mit PDFSharp
fand ich diese Bemerkung in einer Probe von PDFSharp:
// TODO: You can put the code here that converts vom PDF internal image format to a
// Windows bitmap
// and use GDI+ to save it in PNG format.
// [...]
// Take a look at the file
// PdfSharp.Pdf.Advanced/PdfImage.cs to see how we create the PDF image formats.
Ist für dieses Problem eine Lösung jemand?
Vielen Dank für Ihre Antworten.
EDIT: Weil ich nicht in der Lage bin auf meiner eigenen Frage innerhalb von 8 Stunden zu beantworten, ich tue es auf diese Weise:
Vielen Dank für Ihre sehr schnelle Antwort.
Ich habe einen Code zu der Methode "ExportAsPngImage" hinzugefügt, aber ich habe die gewünschten Ergebnisse nicht erhalten. Es extrahiert nur ein paar mehr Bilder (png) und sie haben nicht die richtigen Farben und sind verzerrt.
Hier ist mein eigentlicher Code:
PdfSharp.Pdf.Filters.FlateDecode flate = new PdfSharp.Pdf.Filters.FlateDecode();
byte[] decodedBytes = flate.Decode(bytes);
System.Drawing.Imaging.PixelFormat pixelFormat;
switch (bitsPerComponent)
{
case 1:
pixelFormat = PixelFormat.Format1bppIndexed;
break;
case 8:
pixelFormat = PixelFormat.Format8bppIndexed;
break;
case 24:
pixelFormat = PixelFormat.Format24bppRgb;
break;
default:
throw new Exception("Unknown pixel format " + bitsPerComponent);
}
Bitmap bmp = new Bitmap(width, height, pixelFormat);
var bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, pixelFormat);
int length = (int)Math.Ceiling(width * bitsPerComponent/8.0);
for (int i = 0; i < height; i++)
{
int offset = i * length;
int scanOffset = i * bmpData.Stride;
Marshal.Copy(decodedBytes, offset, new IntPtr(bmpData.Scan0.ToInt32() + scanOffset), length);
}
bmp.UnlockBits(bmpData);
using (FileStream fs = new FileStream(@"C:\Export\PdfSharp\" + String.Format("Image{0}.png", count), FileMode.Create, FileAccess.Write))
{
bmp.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
}
Ist das der richtige Weg? Oder sollte ich einen anderen Weg wählen? Danke vielmals!
Mit Bezug auf 24 bpp: ein Format RGB, die andere BGR ist. So Marshal.Copy nicht tun, müssen Sie die Bytes tauschen, während Sie kopieren. Daher die falschen Farben. Sie richten die BMP-Daten nicht an DWORD-Grenzen aus. Das sollte die Verzerrung erklären. –