←Select platform

PDFObject Structure

Summary

Contains information of a single PDF object.

Syntax
C#
VB
C++
Java
[SerializableAttribute()] 
public struct PDFObject 
<SerializableAttribute()> 
Public Structure PDFObject  
   Inherits System.ValueType 
public class PDFObject 
[SerializableAttribute()] 
public value class PDFObject : public System.ValueType  

Remarks

The PDFObject structure contains information of a single PDF text item (character), rectangle or image. To read objects from a PDF file, use the PDFDocument.ParsePages method. After this method returns and depending on the value of PDFParsePagesOptions parameter passed to the method, the PDFDocumentPage.Objects, PDFDocumentPage.Annotations, PDFDocumentPage.FormFields, PDFDocumentPage.Signatures and PDFDocumentPage.Hyperlinks collections will be populated with the items of the PDF page.

Example

This example will read all the objects from a PDF page and then re-draw these objects on an image that closely resembles the original PDF page before saving it to disk. You can use this example as a base for drawing a PDF page as a "vector" drawing.

C#
VB
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:\Users\Public\Documents\LEADTOOLS Images"; 
} 
Imports Leadtools 
Imports Leadtools.Codecs 
Imports Leadtools.Pdf 
Imports Leadtools.WinForms 
Imports Leadtools.Drawing 
 
Public Sub PDFObjectExample() 
   Dim pdfFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "Leadtools.pdf") 
   Dim pngFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "LEAD_png.png") 
 
   ' Create a PDF document for file at 200 DPI 
   Using document As PDFDocument = New PDFDocument(pdfFileName) 
      document.Resolution = 200 
 
      ' Parse the objects of the first page 
      document.ParseDocumentStructure(PDFParseDocumentStructureOptions.Fonts) 
      document.ParsePages(PDFParsePagesOptions.Fonts Or PDFParsePagesOptions.Objects, 1, 1) 
 
      ' Get the page 
      Dim page As PDFDocumentPage = document.Pages(0) 
 
      ' Get the image of the page so we can use it to get the source image objects 
      Using pageImage As RasterImage = document.GetPageImage(Nothing, page.PageNumber) 
         ' Create the bitmap to draw the objects to 
         Using btmp As Bitmap = New Bitmap(page.WidthPixels, page.HeightPixels) 
            btmp.SetResolution(document.Resolution, document.Resolution) 
            Using g As Graphics = Graphics.FromImage(btmp) 
               g.Clear(Color.White) 
 
               ' Render the objects 
 
               ' Text is line at a time 
               Dim textRect As LeadRect = LeadRect.Empty 
               Dim textFontHeight As Double = 0 
               Dim textLine As StringBuilder = New StringBuilder() 
 
               For Each obj As PDFObject In page.Objects 
                  Select Case obj.ObjectType 
                     Case PDFObjectType.Image 
                        RenderImage(g, pageImage, page, obj) 
 
                     Case PDFObjectType.Text 
                        ' Add the text code and rects together 
                        textLine.Append(obj.Code) 
                        Dim rc As PDFRect = page.ConvertRect(PDFCoordinateType.Pdf, PDFCoordinateType.Pixel, obj.Bounds) 
                        Dim objRect As LeadRect = LeadRect.FromLTRB(CInt(rc.Left), CInt(rc.Top), CInt(rc.Right), CInt(rc.Bottom)) 
                        If textRect.IsEmpty Then 
                           textRect = objRect 
                        Else 
                           textRect = LeadRect.Union(textRect, objRect) 
                        End If 
 
                        textFontHeight = Math.Max(textFontHeight, obj.TextProperties.FontHeight) 
 
                        ' If this is the last object in a line, render it 
                        If obj.TextProperties.IsEndOfLine Then 
                           RenderText(g, document, page, textLine.ToString(), textRect, obj.TextProperties, textFontHeight) 
 
                           textLine = New StringBuilder() 
                           textRect = LeadRect.Empty 
                        End If 
                  End Select 
               Next obj 
            End Using 
 
            btmp.Save(pngFileName, System.Drawing.Imaging.ImageFormat.Png) 
         End Using 
      End Using 
   End Using 
End Sub 
 
Private Shared Sub RenderImage(ByVal g As Graphics, ByVal pageImage As RasterImage, ByVal page As PDFDocumentPage, ByVal obj As PDFObject) 
   Dim destRect As LeadRect = New LeadRect(0, 0, page.WidthPixels, page.HeightPixels) 
 
   ' Get the object coordinates in pixels 
   Dim rc As PDFRect = page.ConvertRect(PDFCoordinateType.Pdf, PDFCoordinateType.Pixel, obj.Bounds) 
   Dim destClipRect As LeadRect = LeadRect.FromLTRB(CInt(rc.Left), CInt(rc.Top), CInt(rc.Right), CInt(rc.Bottom)) 
 
   ' Draw from the page image to the destination graphics 
   Dim props As RasterPaintProperties = RasterPaintProperties.Default 
   props.PaintEngine = RasterPaintEngine.GdiPlus 
   RasterImagePainter.Paint(pageImage, g, LeadRect.Empty, LeadRect.Empty, destRect, destClipRect, props) 
End Sub 
 
Private Shared Sub RenderText(ByVal g As Graphics, ByVal document As PDFDocument, ByVal page As PDFDocumentPage, ByVal text As String, ByVal textRect As LeadRect, ByVal textProperties As PDFTextProperties, ByVal textFontHeight As Double) 
   ' Create the font 
 
   ' Find it in the fonts collection 
   Dim faceName As String = "Arial" 
 
   If Not IsNothing(document.Fonts) AndAlso textProperties.FontIndex < document.Fonts.Count Then 
      Dim font As PDFFont = document.Fonts(textProperties.FontIndex) 
      faceName = font.FaceName 
   End If 
 
   If String.IsNullOrEmpty(faceName) Then 
      ' Could be an embedded font, use Arial 
      faceName = "Arial" 
   End If 
 
   Using f As Font = New Font(faceName, CSng(textFontHeight) * 72 / g.DpiY) 
      Using brush As Brush = New SolidBrush(RasterColorConverter.ToColor(textProperties.Color)) 
         Dim rect As Rectangle = New Rectangle(textRect.X, textRect.Y, textRect.Width, textRect.Height) 
 
         Using sf As StringFormat = New StringFormat() 
            sf.Alignment = StringAlignment.Center 
            sf.LineAlignment = StringAlignment.Center 
            sf.FormatFlags = sf.FormatFlags Or StringFormatFlags.NoClip Or StringFormatFlags.NoWrap 
 
            g.DrawString(text, f, brush, rect, sf) 
         End Using 
      End Using 
   End Using 
End Sub 
 
Public NotInheritable Class LEAD_VARS 
   Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images" 
End Class 

Requirements

Target Platforms

Help Version 20.0.2020.4.3
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2020 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Pdf Assembly