[SerializableAttribute()]
public enum PDFObjectType
Value | Member | Description |
---|---|---|
0 | Text | The item is text. The PDFObject.Code contains the character code for this text item. The PDFObject.Bounds contains the character exact bounds with any internal or external leading in PDF units (1/72 of an inch and bottom left) and the PDFObject.TextProperties property contains its font and color information. |
1 | Rectangle | The item is a rectangle. The coordinates of the rectangle are in PDFObject.Bounds in PDF units (1/72 of an inch and bottom left) |
2 | Image | The item is an image. The coordinates of the image are in PDFObject.Bounds in PDF units (1/72 of an inch and bottom left) |
The PDFObjectType enumeration is used as the type for the PDFObject.ObjectType property and is used to determine the object type.
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Pdf;
using Leadtools.WinForms;
using Leadtools.Drawing;
public void PDFObjectExample()
{
string pdfFileName = Path.Combine(LEAD_VARS.ImagesDir, @"Leadtools.pdf");
string pngFileName = Path.Combine(LEAD_VARS.ImagesDir, @"LEAD_png.png");
// Create a PDF document for file at 200 DPI
using (PDFDocument document = new PDFDocument(pdfFileName))
{
document.Resolution = 200;
// Parse the objects of the first page
document.ParseDocumentStructure(PDFParseDocumentStructureOptions.Fonts);
document.ParsePages(PDFParsePagesOptions.Fonts | PDFParsePagesOptions.Objects, 1, 1);
// Get the page
PDFDocumentPage page = document.Pages[0];
// Get the image of the page so we can use it to get the source image objects
using (RasterImage pageImage = document.GetPageImage(null, page.PageNumber))
{
// Create the bitmap to draw the objects to
using (Bitmap btmp = new Bitmap(page.WidthPixels, page.HeightPixels))
{
btmp.SetResolution(document.Resolution, document.Resolution);
using (Graphics g = Graphics.FromImage(btmp))
{
g.Clear(Color.White);
// Render the objects
// Text is line at a time
LeadRect textRect = LeadRect.Empty;
double textFontHeight = 0;
StringBuilder textLine = new StringBuilder();
foreach (PDFObject obj in page.Objects)
{
switch (obj.ObjectType)
{
case PDFObjectType.Image:
RenderImage(g, pageImage, page, obj);
break;
case PDFObjectType.Text:
// Add the text code and rects together
textLine.Append(obj.Code);
PDFRect rc = page.ConvertRect(PDFCoordinateType.Pdf, PDFCoordinateType.Pixel, obj.Bounds);
LeadRect objRect = LeadRect.FromLTRB((int)rc.Left, (int)rc.Top, (int)rc.Right, (int)rc.Bottom);
if (textRect.IsEmpty)
{
textRect = objRect;
}
else
{
textRect = LeadRect.Union(textRect, objRect);
}
textFontHeight = Math.Max(textFontHeight, obj.TextProperties.FontHeight);
// If this is the last object in a line, render it
if (obj.TextProperties.IsEndOfLine)
{
RenderText(g, document, page, textLine.ToString(), textRect, obj.TextProperties, textFontHeight);
textLine = new StringBuilder();
textRect = LeadRect.Empty;
}
break;
}
}
}
btmp.Save(pngFileName, System.Drawing.Imaging.ImageFormat.Png);
}
}
}
}
private static void RenderImage(Graphics g, RasterImage pageImage, PDFDocumentPage page, PDFObject obj)
{
LeadRect destRect = new LeadRect(0, 0, page.WidthPixels, page.HeightPixels);
// Get the object coordinates in pixels
PDFRect rc = page.ConvertRect(PDFCoordinateType.Pdf, PDFCoordinateType.Pixel, obj.Bounds);
LeadRect destClipRect = LeadRect.FromLTRB((int)rc.Left, (int)rc.Top, (int)rc.Right, (int)rc.Bottom);
// Draw from the page image to the destination graphics
RasterPaintProperties props = RasterPaintProperties.Default;
props.PaintEngine = RasterPaintEngine.GdiPlus;
RasterImagePainter.Paint(
pageImage,
g,
LeadRect.Empty,
LeadRect.Empty,
destRect,
destClipRect,
props);
}
private static void RenderText(Graphics g, PDFDocument document, PDFDocumentPage page, string text, LeadRect textRect, PDFTextProperties textProperties, double textFontHeight)
{
// Create the font
// Find it in the fonts collection
string faceName = null;
if (document.Fonts != null && textProperties.FontIndex < document.Fonts.Count)
{
PDFFont font = document.Fonts[textProperties.FontIndex];
faceName = font.FaceName;
}
if (string.IsNullOrEmpty(faceName))
{
// Could be an embedded font, use Arial
faceName = "Arial";
}
using (Font f = new Font(faceName, (float)textFontHeight * 72 / g.DpiY))
{
using (Brush brush = new SolidBrush(RasterColorConverter.ToColor(textProperties.Color)))
{
Rectangle rect = new Rectangle(textRect.X, textRect.Y, textRect.Width, textRect.Height);
using (StringFormat sf = new StringFormat())
{
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
sf.FormatFlags |= StringFormatFlags.NoClip | StringFormatFlags.NoWrap;
g.DrawString(text, f, brush, rect, sf);
}
}
}
}
static class LEAD_VARS
{
public const string ImagesDir = @"C:\LEADTOOLS23\Resources\Images";
}