LEADTOOLS PDF(Leadtools.Pdfアセンブリ)

フレームを表示

PDFObject構造体






メンバ 
単一のPDFオブジェクトの情報を格納します。
オブジェクトモデル
構文
[SerializableAttribute()]
public struct PDFObject : System.ValueType 
'Declaration
 
<SerializableAttribute()>
Public Structure PDFObject 
   Inherits System.ValueType
'Usage
 
Dim instance As PDFObject
public class PDFObject
[SerializableAttribute()]
public value class PDFObject : public System.ValueType 
解説

PDFObject構造体は、単一のPDFテキスト項目(文字)、長方形またはimageの情報を格納します。PDFファイルからオブジェクトを読み込むために、PDFDocument.ParsePagesメソッドを使います。このメソッドが返って、PDFParsePagesOptionsパラメーターの値に従いメソッドに渡したあと、PDFDocumentPage'sPDFDocumentPage.FontsPDFDocumentPage.ObjectsPDFDocumentPage.Annotationsm PDFDocumentPage.FormFieldsPDFDocumentPage.SignaturesPDFDocumentPage.HyperlinksコレクションはPDFページの項目で値を入力されます。

サンプル

このサンプルでは、PDFページからすべてのオブジェクトを読み取り、ディスクに保存する前にオリジナルのPDFページによく似た画像上でこれらのオブジェクトを再描画します。描画している「ベクトル」としてPDFページを描画するためのベースとして、このサンプルを使うことができます。

Copy Code  
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.Pdf
Imports Leadtools.WinForms
Imports Leadtools.Drawing

<TestMethod> _
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.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, 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 page As PDFDocumentPage, ByVal text As String, ByVal textRect As LeadRect, ByVal textProperties As PDFTextProperties, ByVal textFontHeight As Double)
  ' Create the font
  Dim font As PDFFont = page.Fonts(textProperties.FontIndex)
  Dim faceName As String = font.FaceName
  If String.IsNullOrEmpty(faceName) Then
    ' Could be an embedded font, use Arial
    faceName = "Arial"
  End If

  Dim fontStyle As FontStyle = FontStyle.Regular

  If (font.FontStyle And PDFFontStyle.Bold) = PDFFontStyle.Bold Then
    fontStyle = fontStyle Or FontStyle.Bold
  End If

  If (font.FontStyle And PDFFontStyle.Italic) = PDFFontStyle.Italic Then
    fontStyle = fontStyle Or FontStyle.Italic
  End If

  If (font.FontStyle And PDFFontStyle.Underline) = PDFFontStyle.Underline Then
    fontStyle = fontStyle Or FontStyle.Underline
  End If

  Using f As Font = New Font(faceName, CSng(textFontHeight) * 72 / g.DpiY, fontStyle)
    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
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Pdf;
using Leadtools.WinForms;
using Leadtools.Drawing;

[TestMethod]
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.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, 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, PDFDocumentPage page, string text, LeadRect textRect, PDFTextProperties textProperties, double textFontHeight)
{
   // Create the font
   PDFFont font = page.Fonts[textProperties.FontIndex];
   string faceName = font.FaceName;
   if(string.IsNullOrEmpty(faceName))
   {
      // Could be an embedded font, use Arial
      faceName = "Arial";
   }

   FontStyle fontStyle = FontStyle.Regular;

   if((font.FontStyle & PDFFontStyle.Bold) == PDFFontStyle.Bold)
   {
      fontStyle |= FontStyle.Bold;
   }

   if((font.FontStyle & PDFFontStyle.Italic) == PDFFontStyle.Italic)
   {
      fontStyle |= FontStyle.Italic;
   }

   if((font.FontStyle & PDFFontStyle.Underline) == PDFFontStyle.Underline)
   {
      fontStyle |= FontStyle.Underline;
   }

   using(Font f = new Font(faceName, (float)textFontHeight * 72 / g.DpiY, fontStyle))
   {
      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";
}
必要条件

ターゲットプラットホーム

参照

参照

PDFObjectメンバ
Leadtools.Pdf名前空間

   Leadtools.Pdfは、PDF Pro、Pro Suite、ドキュメントまたはメディカルがキーを認可して、ロック解除することを義務づけます。詳細は、以下を参照してください。LEADTOOLSツールキット機能