Bonjour à tous,
Je développe actuellement un logiciel dont l'une des fonctionnalités est l'extraction des photos contenues dans un fichier PDF. Particularité de ces photos : elles sont encodées en CMJN (Cyan Magenta Jaune Noir) et non en RVB (Rouge Vert Bleu). Voila donc mon problème : j'ai essayé de les extraire grace à la libraire iTextSharp, mais j'obtiens alors des images en "sépia". Voici la méthode que j'ai utilisé :
J'ai tenté une conversion de CMJN vers RVB à différents moments du processus, sans succès.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 public static List<Image> ExtraireImages(String PDFPath) { // Initialiser une liste d'images (System) // List<Image> listImages = new List<Image>(); // Construire un PDFReader a partir du chemin passe en parametre // PdfReader PDFrdr = null; try { PDFrdr = new PdfReader(PDFPath); } catch (Exception e) { MessageBox.Show(e.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } PdfObject PDFobj; PdfStream PDFstr; // Parcourir l'ensemble des references du document PDF // for (int i = 0; i < PDFrdr.XrefSize; i++) { // Recuperer l'objet pointe par la reference courante // PDFobj = PDFrdr.GetPdfObject(i); // Controler le type de l'objet : ce doit etre un flux (PDF) // if (PDFobj != null && PDFobj.IsStream()) { // Caster l'objet en flux (PDF) // PDFstr = (PdfStream)PDFobj; // Determiner le sous-type du flux (PDF) // PdfObject subtype = PDFstr.Get(PdfName.SUBTYPE); // Controler le sous-type du flux (PDF) : ce doit etre une image (PDF) // if (subtype != null && subtype == PdfName.IMAGE) { // Recuperer le contenu du flux (PDF) // byte[] data = null; try { data = PdfReader.GetStreamBytesRaw((PRStream)PDFstr); } catch (Exception e) { MessageBox.Show(e.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } if (data != null) { // Contruire un flux (System) a partir du contenu // System.IO.MemoryStream ms = new System.IO.MemoryStream(data); // Construire l'image (System) a partir du flux (System) // Image img = Image.FromStream(ms, true); // Ajouter l'image (System) a la liste // listImages.Add(img); } } } } // Fermer le PDFReader // PDFrdr.Close(); // Renvoyer la liste d'images (System) // return listImages; }
J'ai ensuite envisagé une autre solution : l'extraction de chaque page au format JPEG. Apparement, iTextSharp ne permet pas une telle chose, j'ai essayé avec PDFSharp. Mais dans ce cas, je n'obtiens que des images totalement noires (que les images soient en RVB ou en CMJN).
Voici la méthode utilisée :
Je sais qu'il est possible d'utiliser GhostScript pour ce type de traitement, mais d'après ce que j'ai vu sur le web (wrapper c# trouvé sur un autre site), c'est assez complexe à mettre en oeuvre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 static void Main(string[] args) { string path = @"C:\Users\MBEditions\Desktop\PDFs\P0609600228-1.pdf"; PdfSharp.Pdf.PdfDocument doc = PdfSharp.Pdf.IO.PdfReader.Open(path); PdfSharp.Drawing.XGraphics g = PdfSharp.Drawing.XGraphics.FromPdfPage(doc.Pages[0]); Bitmap b = new Bitmap((int)doc.Pages[0].Width.Point, (int)doc.Pages[0].Width.Point, g.Graphics); b.Save(@"C:\Users\MBEditions\Desktop\test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); }
Voilà donc ma question : est-ce qu'il y a un moyen d'utiliser iTextSharp ou PDFSharp ou même une solution similaire pour ce traitement ou bien GhostScript est-il ma seule issue de secours ?
Je cherche une solution gratuite![]()
Merci d'avoir pris la peine de lire ce post jusqu'au bout![]()
Partager