GetImageProperties.cs
- //
- // This code is part of Document Solutions for PDF demos.
- // Copyright (c) MESCIUS inc. All rights reserved.
- //
- using System;
- using System.IO;
- using System.Drawing;
- using System.Collections.Generic;
- using GrapeCity.Documents.Pdf;
- using GrapeCity.Documents.Pdf.Graphics.Images;
- using GrapeCity.Documents.Pdf.Spec;
- using GrapeCity.Documents.Text;
- using GrapeCity.Documents.Drawing;
-
- namespace DsPdfWeb.Demos
- {
- // This example shows how to fetch low level information about images living in a PDF file,
- // such as the ID of the image object in the PDF, the filter used to store the image,
- // the decoder parameters, the content of the PdfImage dictionary, etc.
- // The original PDF is appended to the result for reference.
- public class GetImageProperties
- {
- public int CreatePDF(Stream stream)
- {
- using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "Wetlands.pdf"));
- var docSrc = new GcPdfDocument();
- docSrc.Load(fs);
-
- // Get the images in the loaded PDF and print their info into the resulting PDF:
- var imageInfos = docSrc.GetImages();
-
- // The PDF to hold the results:
- var doc = new GcPdfDocument();
- var page = doc.NewPage();
- // Set up a TextLayout to format the results:
- var tl = page.Graphics.CreateTextLayout();
- tl.DefaultFormat.Font = StandardFonts.Courier;
- tl.DefaultFormat.FontSize = 14;
- tl.MaxWidth = doc.PageSize.Width;
- tl.MaxHeight = doc.PageSize.Height;
- tl.MarginAll = tl.Resolution;
- var captionFmt = new TextFormat(tl.DefaultFormat) { Font = StandardFonts.CourierBold, FontSize = tl.DefaultFormat.FontSize + 2 };
-
- int i = 0;
- foreach (var imageInfo in imageInfos)
- {
- tl.AppendLine($"Image {++i}", captionFmt);
-
- // PdfImageBase class represents an image in the loaded PDF file:
- PdfImageBase img = imageInfo.Image;
-
- tl.AppendLine($"PdfImage object ID: {img.ObjID}");
- // PdfImageBase is derived from PdfDictWrapper type, it has methods
- // that allow you to access properties/data of the underlying PDF stream object:
- using (PdfStreamInfo psi = img.GetPdfStreamInfo())
- {
- tl.AppendLine($" Image stream length: {psi.Stream.Length}");
- tl.AppendLine($" ImageFilterName: {psi.ImageFilterName}");
- tl.AppendLine($"ImageFilterDecodeParams: {psi.ImageFilterDecodeParams}");
- // Dump the content of the ImageFilterDecodeParams if it exists:
- if (psi.ImageFilterDecodeParams != null)
- {
- foreach (var kvp in psi.ImageFilterDecodeParams.Dict)
- {
- tl.AppendLine($"{kvp.Key}: {kvp.Value}");
- }
- // An example of how to get the value of BlackIs1:
- var blackIs1 = psi.ImageFilterDecodeParams.GetBool(PdfName.Std.BlackIs1, null);
- tl.AppendLine($"BlackIs1: {blackIs1}");
- }
- }
- // Dump the properties of PdfImage dictionary:
- tl.AppendLine();
- tl.AppendLine("Properties of PdfImage dictionary:");
- foreach (KeyValuePair<PdfName, IPdfObject> kvp in img.PdfDict.Dict)
- {
- tl.AppendLine($"{kvp.Key}: {kvp.Value}");
- }
- //
- var cs = img.Get<IPdfObject>(PdfName.Std.ColorSpace);
- tl.AppendLine($"ColorSpace: {cs.GetType().Name} {cs}");
- var bpc = img.Get<IPdfObject>(PdfName.Std.BitsPerComponent);
- tl.AppendLine($"BitsPerComponent: {bpc?.GetType().Name} {bpc}");
- tl.AppendLine();
- }
-
- // Render the results:
- tl.PerformLayout(true);
- while (true)
- {
- var splitResult = tl.Split(null, out TextLayout rest);
- page.Graphics.DrawTextLayout(tl, PointF.Empty);
- if (splitResult != SplitResult.Split)
- break;
- tl = rest;
- tl.MarginTop = tl.Resolution;
- page = doc.Pages.Add();
- }
-
- // Append the source PDF to the result for reference:
- doc.MergeWithDocument(docSrc);
-
- // Done:
- doc.Save(stream);
- return doc.Pages.Count;
- }
- }
- }
-