Leadtools.Pdfアセンブリ > Leadtools.Pdf名前空間 :PDFObject構造体 |
[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.Fonts、PDFDocumentPage.Objects、PDFDocumentPage.Annotationsm PDFDocumentPage.FormFields、PDFDocumentPage.SignaturesとPDFDocumentPage.HyperlinksコレクションはPDFページの項目で値を入力されます。
このサンプルでは、PDFページからすべてのオブジェクトを読み取り、ディスクに保存する前にオリジナルのPDFページによく似た画像上でこれらのオブジェクトを再描画します。描画している「ベクトル」としてPDFページを描画するためのベースとして、このサンプルを使うことができます。
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"; }