PDF: Работа с PDF страницей
В этом разделе
Класс
PdfPage представляет собой страницу PDF документа и позволяет:
- создать пустую PDF страницу
-
получить информацию о PDF странице
- получить информацию о PDF странице - PdfPage.MediaBox, PdfPage.CropBox, PdfPage.Size, PdfPage.DefaultResolution, PdfPage.Rotate, PdfPage.LastModified
- получение информации о ресурсах изображений, связанных с PDF страницей - PdfPage.GetImages, PdfPage.ImagesSize
- получить массив шрифтов, связанных с PDF страницей - PdfPage.GetFonts.
- получить или установить метаданные, связанные с PDF страницей - PdfPage.Metadata
- определить, что страница является image-only страницей - PdfPage.IsImageOnly
- отрендерить PDF страницу - PdfPage.Render
- получить PdfGraphics, связанные с PDF страницей - PdfPage.GetGraphics
-
получить доступ к миниатюре PDF страницы
- получить или установить миниатюру PDF страницы - PdfPage.Thumbnail
- отрендерить миниатюру (получить миниатюру заданного размера) PDF страницы - PdfPage.GetThumbnail.
- создать миниатюру (отрендеренное изображение страницы, сохраненное как миниатюра) PDF страницы в PDF документе - PdfPage.CreateThumbnail
-
получить доступ к аннотациям PDF страницы
- преобразовать точку(и) из пространства координат изображения в пространство координат страницы - PdfPage.PointToUnit, PdfPage.PointsToUnits
- преобразовать точку(и) из пространства координат страницы в пространство координат изображения - PdfPage.PointToPixel.
Вот C#/VB.NET код, который демонстрирует, как создать новую PDF страницу и добавить ее в PDF документ:
// page size
System.Drawing.RectangleF pageSize = new System.Drawing.RectangleF(0, 0, 600, 800);
// create new page of specified size
Vintasoft.Imaging.Pdf.Tree.PdfPage page =
new Vintasoft.Imaging.Pdf.Tree.PdfPage(document, pageSize);
// add page to a PDF document
document.Pages.Add(page);
' page size
Dim pageSize As New System.Drawing.RectangleF(0, 0, 600, 800)
' create new page of specified size
Dim page As New Vintasoft.Imaging.Pdf.Tree.PdfPage(document, pageSize)
' add page to a PDF document
document.Pages.Add(page)
Вот C#/VB.NET код, который демонстрирует, как получить информацию о ресурсах изображений на всех страницах PDF документа:
/// <summary>
/// Gets and prints information about PDF image resources.
/// </summary>
/// <param name="pdfFileName">The filename of PDF document.</param>
public static void GetImageResourcesInfo(string pdfFileName)
{
// open PDF document
using (Vintasoft.Imaging.Pdf.PdfDocument document = new Vintasoft.Imaging.Pdf.PdfDocument(pdfFileName))
{
// for each PDF page
for (int pageIndex = 0; pageIndex < document.Pages.Count; pageIndex++)
{
// get PDF page
Vintasoft.Imaging.Pdf.Tree.PdfPage page = document.Pages[pageIndex];
// get a collection of PDF image resources of page
Vintasoft.Imaging.Pdf.Tree.PdfImageResource[] imageResources = page.GetImages();
// print the page index and count of image resources
System.Console.WriteLine("Page {0} Image resources count: {1}", pageIndex + 1, imageResources.Length);
// for each image resource
foreach (Vintasoft.Imaging.Pdf.Tree.PdfImageResource imageResource in imageResources)
{
// print information about image resource
System.Console.WriteLine("\t {0}x{1} {2,5}bpp {3}",
imageResource.Width, imageResource.Height,
imageResource.BitsPerPixel, imageResource.Compression);
}
}
}
}
/* This code example produces the following output:
Page 1 Image resources count: 9
157x139 32bpp Zip
157x139 8bpp Jpeg
700x596 24bpp Jpeg
686x585 24bpp Jpeg
459x317 32bpp Jpeg
459x317 8bpp Zip, Predictor
484x487 32bpp Jpeg
484x487 8bpp Zip, Predictor
824x537 24bpp Zip
Page 2 Image resources count: 0
*/
''' <summary>
''' Gets and prints information about PDF image resources.
''' </summary>
''' <param name="pdfFileName">The filename of PDF document.</param>
Public Shared Sub GetImageResourcesInfo(pdfFileName As String)
' open PDF document
Using document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFileName)
' for each PDF page
For pageIndex As Integer = 0 To document.Pages.Count - 1
' get PDF page
Dim page As Vintasoft.Imaging.Pdf.Tree.PdfPage = document.Pages(pageIndex)
' get a collection of PDF image resources of page
Dim imageResources As Vintasoft.Imaging.Pdf.Tree.PdfImageResource() = page.GetImages()
' print the page index and count of image resources
System.Console.WriteLine("Page {0} Image resources count: {1}", pageIndex + 1, imageResources.Length)
' for each image resource
For Each imageResource As Vintasoft.Imaging.Pdf.Tree.PdfImageResource In imageResources
' print information about image resource
System.Console.WriteLine(vbTab & " {0}x{1} {2,5}bpp {3}", imageResource.Width, imageResource.Height, imageResource.BitsPerPixel, imageResource.Compression)
Next
Next
End Using
End Sub
' This code example produces the following output:
'
' Page 1 Image resources count: 9
' 157x139 32bpp Zip
' 157x139 8bpp Jpeg
' 700x596 24bpp Jpeg
' 686x585 24bpp Jpeg
' 459x317 32bpp Jpeg
' 459x317 8bpp Zip, Predictor
' 484x487 32bpp Jpeg
' 484x487 8bpp Zip, Predictor
' 824x537 24bpp Zip
' Page 2 Image resources count: 0
'
Система координат и единицы измерения PDF страницы
PDF страница использует декартову систему координат, т.е. центр системы координат расположен в левом нижнем углу PDF страницы, ось X направлена слева направо, ось Y - снизу вверх.
PDF документ - это документ в векторном формате, который не содержит информации о разрешении документа, то есть PDF страница документа может быть отрендерена в любом разрешении. По умолчанию PDF страница использует пользовательскую единицу измерения в качестве единицы измерения. 1 пользовательская единица измерения равна 1/72 дюйма.
Изображение имеет систему координат, отличную от системы координат PDF страницы. Центр системы координат изображения находится в левом верхнем углу изображения, ось X направлена слева направо, ось Y - сверху вниз.
SDK предоставляет методы, которые упрощают процесс перевода точек из системы координат изображения в систему координат PDF страницы и наоборот:
Вот список методов класса
PdfPage, которые используются для конвертации координат:
- PdfPage.PointsFromImageSpaceToPageSpace - переводит точки из системы координат изображения в систему координат PDF страницы с учетом отражения системы координат по оси Y, региона обрезки (crop box) и поворота страницы
- PdfPage.PointsFromPageSpaceToImageSpace - переводит точки из системы координат PDF страницы в систему координат изображения с учетом отражения системы координат по оси Y, региона обрезки (crop box) и поворота страницы
- PdfPage.PointsToUnits - переводит точки из системы координат изображения в систему координат PDF страницы с учетом отражения системы координат по оси Y
- PdfPage.UnitsToPixels - переводит точки из системы координат PDF страницы в систему координат изображения с учетом отражения системы координат по оси Y
- PdfPage.PointToPixel - переводит значение из системы координат PDF страницы в систему координат изображения
- PdfPage.PointToUnit - переводит значение из системы координат изображения в систему координат PDF страницы
Вот C#/VB.NET код, который демонстрирует, как перевести прямоугольник, заданный в системе координат изображения, в прямоугольник, заданный в системе координат PDF страницы:
/// <summary>
/// Converts the rectangle from image space to page space.
/// </summary>
/// <param name="rect">Rectangle in image space.</param>
/// <param name="imageResolution">The image resolution.</param>
/// <param name="page">The PDF page.</param>
/// <returns><see cref="System.Drawing.RectangleF"/> structure in PDF page space.</returns>
public static System.Drawing.RectangleF ConvertRectangleFromImageSpaceToPageSpace(
System.Drawing.RectangleF rect,
Vintasoft.Imaging.Resolution imageResolution,
Vintasoft.Imaging.Pdf.Tree.PdfPage page)
{
// Rectangle -> PointF[]
System.Drawing.PointF[] points = new System.Drawing.PointF[] {
rect.Location,
new System.Drawing.PointF(rect.X + rect.Width, rect.Y + rect.Height) };
// ImageSpace -> PageSpace
page.PointsFromImageSpaceToPageSpace(points, imageResolution);
// Points -> RectangleF
float x0 = System.Math.Min(points[0].X, points[1].X);
float y0 = System.Math.Min(points[0].Y, points[1].Y);
float x1 = System.Math.Max(points[0].X, points[1].X);
float y1 = System.Math.Max(points[0].Y, points[1].Y);
return new System.Drawing.RectangleF(x0, y0, x1 - x0, y1 - y0);
}
''' <summary>
''' Converts the rectangle from image space to page space.
''' </summary>
''' <param name="rect">Rectangle in image space.</param>
''' <param name="imageResolution">The image resolution.</param>
''' <param name="page">The PDF page.</param>
''' <returns><see cref="System.Drawing.RectangleF"/> structure in PDF page space.</returns>
Public Shared Function ConvertRectangleFromImageSpaceToPageSpace(rect As System.Drawing.RectangleF, imageResolution As Vintasoft.Imaging.Resolution, page As Vintasoft.Imaging.Pdf.Tree.PdfPage) As System.Drawing.RectangleF
' Rectangle -> PointF[]
Dim points As System.Drawing.PointF() = New System.Drawing.PointF() {rect.Location, New System.Drawing.PointF(rect.X + rect.Width, rect.Y + rect.Height)}
' ImageSpace -> PageSpace
page.PointsFromImageSpaceToPageSpace(points, imageResolution)
' Points -> RectangleF
Dim x0 As Single = System.Math.Min(points(0).X, points(1).X)
Dim y0 As Single = System.Math.Min(points(0).Y, points(1).Y)
Dim x1 As Single = System.Math.Max(points(0).X, points(1).X)
Dim y1 As Single = System.Math.Max(points(0).Y, points(1).Y)
Return New System.Drawing.RectangleF(x0, y0, x1 - x0, y1 - y0)
End Function