PDF: Навигация по PDF документу
В этом разделе
PDF закладки
PDF документ может содержать оглавление. Оглавление может отображаться таким образом, чтобы предоставить пользователю возможность перемещаться по документу с помощью мыши и клавиатуры. Оглавление имеет древовидную структуру и называется Закладками.
Группа закладок определяется с помощью класса
PdfBookmarkCollection. Одиночная закладка определяется с помощью класса
PdfBookmark.
Получение закладок в виде древовидной структуры
Закладки документа можно получить с помощью свойства
PdfDocument.Bookmarks.
Вот C#/VB.NET код, который демонстрирует, как отобразить информацию о дереве закладок PDF документа:
/// <summary>
/// Prints information about the bookmark collection of specified PDF document.
/// </summary>
/// <param name="filename">The filename of PDF document.</param>
public static void PrintBookmarks(string filename)
{
// open PDF document in read-only mode
Vintasoft.Imaging.Pdf.PdfDocument document =
new Vintasoft.Imaging.Pdf.PdfDocument(filename, true);
// print Bookrmarks collection
PrintBookmarkCollection(document.Bookmarks, "");
// close document
document.Dispose();
}
/// <summary>
/// Prints information about the bookmark collection of PDF document.
/// </summary>
public static void PrintBookmarkCollection(
Vintasoft.Imaging.Pdf.Tree.PdfBookmarkCollection bookmarks, string indent)
{
// for each bookmarks in the collection
for (int i = 0; i < bookmarks.Count; i++)
{
Vintasoft.Imaging.Pdf.Tree.PdfBookmark bookmark = bookmarks[i];
// print indent
System.Console.Write(indent);
// print status of child bookmarks
System.Console.Write(bookmark.ChildBookmarks.Count > 0 ? "+" : "-");
// print title
System.Console.Write(bookmark.Title);
// find destination page
Vintasoft.Imaging.Pdf.Tree.PdfDestinationBase destination = bookmark.Destination;
if (destination == null)
{
if (bookmark.Action != null &&
bookmark.Action is Vintasoft.Imaging.Pdf.Tree.PdfGotoAction)
{
destination = ((Vintasoft.Imaging.Pdf.Tree.PdfGotoAction)bookmark.Action).Destination;
}
}
if (destination != null)
{
// print destination page number
int pageIndex = bookmark.Document.Pages.IndexOf(destination.Page);
System.Console.Write(": Page " + (pageIndex + 1).ToString());
}
// print bookmark Flags
if (bookmark.Flags != Vintasoft.Imaging.Pdf.Tree.PdfBookmarkFlags.None)
System.Console.Write(" (" + bookmark.Flags + ")");
System.Console.WriteLine();
// print child bookmarks
PrintBookmarkCollection(bookmark.ChildBookmarks, indent + " ");
}
}
''' <summary>
''' Prints information about the bookmark collection of specified PDF document.
''' </summary>
''' <param name="filename">The filename of PDF document.</param>
Public Shared Sub PrintBookmarks(filename As String)
' open PDF document in read-only mode
Dim document As New Vintasoft.Imaging.Pdf.PdfDocument(filename, True)
' print Bookrmarks collection
PrintBookmarkCollection(document.Bookmarks, "")
' close document
document.Dispose()
End Sub
''' <summary>
''' Prints information about the bookmark collection of PDF document.
''' </summary>
Public Shared Sub PrintBookmarkCollection(bookmarks As Vintasoft.Imaging.Pdf.Tree.PdfBookmarkCollection, indent As String)
' for each bookmarks in the collection
For i As Integer = 0 To bookmarks.Count - 1
Dim bookmark As Vintasoft.Imaging.Pdf.Tree.PdfBookmark = bookmarks(i)
' print indent
System.Console.Write(indent)
' print status of child bookmarks
System.Console.Write(If(bookmark.ChildBookmarks.Count > 0, "+", "-"))
' print title
System.Console.Write(bookmark.Title)
' find destination page
Dim destination As Vintasoft.Imaging.Pdf.Tree.PdfDestinationBase = bookmark.Destination
If destination Is Nothing Then
If bookmark.Action IsNot Nothing AndAlso TypeOf bookmark.Action Is Vintasoft.Imaging.Pdf.Tree.PdfGotoAction Then
destination = DirectCast(bookmark.Action, Vintasoft.Imaging.Pdf.Tree.PdfGotoAction).Destination
End If
End If
If destination IsNot Nothing Then
' print destination page number
Dim pageIndex As Integer = bookmark.Document.Pages.IndexOf(destination.Page)
System.Console.Write(": Page " & (pageIndex + 1).ToString())
End If
' print bookmark Flags
If bookmark.Flags <> Vintasoft.Imaging.Pdf.Tree.PdfBookmarkFlags.None Then
System.Console.Write(" (" & Convert.ToString(bookmark.Flags) & ")")
End If
System.Console.WriteLine()
' print child bookmarks
PrintBookmarkCollection(bookmark.ChildBookmarks, indent & " ")
Next
End Sub
Добавление новой закладки
Чтобы добавить закладку, необходимо сделать следующее:
- Создать закладку
- Определить действия, связанные с закладкой
- Добавить закладку в дерево закладок
Вот C#/VB.NET код, который демонстрирует, как добавить новые закладки в PDF документ:
/// <summary>
/// Creates bookmarks in PDF document.
/// </summary>
/// <param name="pdfFilename">The filename of PDF document.</param>
public static void CreateBookmarks(string pdfFilename)
{
// open PDF document in read-write mode
Vintasoft.Imaging.Pdf.PdfDocument document =
new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename);
// if PDF document does not contain bookmark collection
if (document.Bookmarks == null)
// create bookmark collection of PDF document
document.Bookmarks =
new Vintasoft.Imaging.Pdf.Tree.PdfBookmarkCollection(document);
// get bookmarks collection
Vintasoft.Imaging.Pdf.Tree.PdfBookmarkCollection bookmarks = document.Bookmarks;
if (bookmarks.Count > 1)
{
// delete first bookmark
bookmarks.RemoveAt(0);
// delete last bookmark
bookmarks.RemoveAt(bookmarks.Count - 1);
}
// create first bookmark
Vintasoft.Imaging.Pdf.Tree.PdfBookmark firstBookmark =
new Vintasoft.Imaging.Pdf.Tree.PdfBookmark(document);
firstBookmark.Title = "First Page";
firstBookmark.Flags = Vintasoft.Imaging.Pdf.Tree.PdfBookmarkFlags.Bold;
firstBookmark.Destination = new Vintasoft.Imaging.Pdf.Tree.PdfDestinationFit(document, document.Pages[0]);
// create last bookmark
Vintasoft.Imaging.Pdf.Tree.PdfBookmark lastBookmark =
new Vintasoft.Imaging.Pdf.Tree.PdfBookmark(document);
lastBookmark.Title = "Last Page";
lastBookmark.Flags = Vintasoft.Imaging.Pdf.Tree.PdfBookmarkFlags.Bold;
lastBookmark.Destination =
new Vintasoft.Imaging.Pdf.Tree.PdfDestinationFit(document, document.Pages[document.Pages.Count - 1]);
// insert first bookmark
bookmarks.Insert(0, firstBookmark);
// add last bookmark
bookmarks.Add(lastBookmark);
// save document
document.SaveChanges();
// close document
document.Dispose();
}
''' <summary>
''' Creates bookmarks in PDF document.
''' </summary>
''' <param name="pdfFilename">The filename of PDF document.</param>
Public Shared Sub CreateBookmarks(pdfFilename As String)
' open PDF document in read-write mode
Dim document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
' if PDF document does not contain bookmark collection
If document.Bookmarks Is Nothing Then
' create bookmark collection of PDF document
document.Bookmarks = New Vintasoft.Imaging.Pdf.Tree.PdfBookmarkCollection(document)
End If
' get bookmarks collection
Dim bookmarks As Vintasoft.Imaging.Pdf.Tree.PdfBookmarkCollection = document.Bookmarks
If bookmarks.Count > 1 Then
' delete first bookmark
bookmarks.RemoveAt(0)
' delete last bookmark
bookmarks.RemoveAt(bookmarks.Count - 1)
End If
' create first bookmark
Dim firstBookmark As New Vintasoft.Imaging.Pdf.Tree.PdfBookmark(document)
firstBookmark.Title = "First Page"
firstBookmark.Flags = Vintasoft.Imaging.Pdf.Tree.PdfBookmarkFlags.Bold
firstBookmark.Destination = New Vintasoft.Imaging.Pdf.Tree.PdfDestinationFit(document, document.Pages(0))
' create last bookmark
Dim lastBookmark As New Vintasoft.Imaging.Pdf.Tree.PdfBookmark(document)
lastBookmark.Title = "Last Page"
lastBookmark.Flags = Vintasoft.Imaging.Pdf.Tree.PdfBookmarkFlags.Bold
lastBookmark.Destination = New Vintasoft.Imaging.Pdf.Tree.PdfDestinationFit(document, document.Pages(document.Pages.Count - 1))
' insert first bookmark
bookmarks.Insert(0, firstBookmark)
' add last bookmark
bookmarks.Add(lastBookmark)
' save document
document.SaveChanges()
' close document
document.Dispose()
End Sub
Изменение закладки
Чтобы изменить закладку, необходимо сделать следующее:
- Найдите закладку, которую необходимо изменить
- Измените закладку с помощью ее свойств
Вот C#/VB.NET код, который демонстрирует, как изменить текст закладки:
/// <summary>
/// Changes title of the first bookmark of PDF document.
/// </summary>
/// <param name="pdfFilename">The filename of PDF document.</param>
public static void ChangeFirstBookmarkTitle(string pdfFilename)
{
// open PDF document
using (Vintasoft.Imaging.Pdf.PdfDocument document =
new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename))
{
// get the first bookmark of PDF document
Vintasoft.Imaging.Pdf.Tree.PdfBookmark bookmark = document.Bookmarks[0];
// change title of bookmark
bookmark.Title = "First bookmark";
// save changes to a file
document.SaveChanges();
}
}
''' <summary>
''' Changes title of the first bookmark of PDF document.
''' </summary>
''' <param name="pdfFilename">The filename of PDF document.</param>
Public Shared Sub ChangeFirstBookmarkTitle(pdfFilename As String)
' open PDF document
Using document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
' get the first bookmark of PDF document
Dim bookmark As Vintasoft.Imaging.Pdf.Tree.PdfBookmark = document.Bookmarks(0)
' change title of bookmark
bookmark.Title = "First bookmark"
' save changes to a file
document.SaveChanges()
End Using
End Sub
Удаление закладки
Чтобы удалить закладку, необходимо сделать следующее:
Вот C#/VB.NET код, который демонстрирует, как удалить все закладки из PDF документа:
/// <summary>
/// Removes all bookmarks of PDF document.
/// </summary>
/// <param name="pdfFilename">The filename of PDF document.</param>
public static void RemoveAllBookmarks(string pdfFilename)
{
// open PDF document
using (Vintasoft.Imaging.Pdf.PdfDocument document =
new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename))
{
// get the collection of bookmark of PDF document
Vintasoft.Imaging.Pdf.Tree.PdfBookmarkCollection bookmarks = document.Bookmarks;
// if PDF document has bookmarks
if (bookmarks != null)
// clear bookmarks of PDF document
bookmarks.Clear();
// save changes to a file
document.SaveChanges();
}
}
''' <summary>
''' Removes all bookmarks of PDF document.
''' </summary>
''' <param name="pdfFilename">The filename of PDF document.</param>
Public Shared Sub RemoveAllBookmarks(pdfFilename As String)
' open PDF document
Using document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
' get the collection of bookmark of PDF document
Dim bookmarks As Vintasoft.Imaging.Pdf.Tree.PdfBookmarkCollection = document.Bookmarks
' if PDF document has bookmarks
If bookmarks IsNot Nothing Then
' clear bookmarks of PDF document
bookmarks.Clear()
End If
' save changes to a file
document.SaveChanges()
End Using
End Sub
Действие закладки
Любая закладка может иметь действие, которое будет выполняться при ее выборе.
Вот C#/VB.NET код, который демонстрирует, как назначить действие закладке:
/// <summary>
/// Changes action of the first bookmark of PDF document.
/// </summary>
/// <param name="pdfFilename">The filename of PDF document.</param>
public static void ChangeFirstBookmarkAction(string pdfFilename)
{
// open PDF document
using (Vintasoft.Imaging.Pdf.PdfDocument document =
new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename))
{
// create goto action to the last page of PDF document
Vintasoft.Imaging.Pdf.Tree.PdfDestinationFit dest =
new Vintasoft.Imaging.Pdf.Tree.PdfDestinationFit(document, document.Pages[document.Pages.Count - 1]);
Vintasoft.Imaging.Pdf.Tree.PdfGotoAction newAction =
new Vintasoft.Imaging.Pdf.Tree.PdfGotoAction(dest);
// get the first bookmark of PDF document
Vintasoft.Imaging.Pdf.Tree.PdfBookmark bookmark = document.Bookmarks[0];
// change the action of bookmark
bookmark.Action = newAction;
// save changes to a file
document.SaveChanges();
}
}
''' <summary>
''' Changes action of the first bookmark of PDF document.
''' </summary>
''' <param name="pdfFilename">The filename of PDF document.</param>
Public Shared Sub ChangeFirstBookmarkAction(pdfFilename As String)
' open PDF document
Using document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
' create goto action to the last page of PDF document
Dim dest As New Vintasoft.Imaging.Pdf.Tree.PdfDestinationFit(document, document.Pages(document.Pages.Count - 1))
Dim newAction As New Vintasoft.Imaging.Pdf.Tree.PdfGotoAction(dest)
' get the first bookmark of PDF document
Dim bookmark As Vintasoft.Imaging.Pdf.Tree.PdfBookmark = document.Bookmarks(0)
' change the action of bookmark
bookmark.Action = newAction
' save changes to a file
document.SaveChanges()
End Using
End Sub
Встраиваемые миниатюры PDF страниц
PDF страницы могут иметь встроенную миниатюру. В большинстве случаев встроенная миниатюра используется только для страниц с изображениями, т. е. для страниц, представляющих собой отсканированные изображения.
Встроенную миниатюру можно получить с помощью свойства
PdfPage.Thumbnail.
Также миниатюру страницы можно получить с помощью метода
PdfPage.GetThumbnail. Метод возвращает встроенную миниатюру, если она существует и соответствует запрашиваемым размерам. В противном случае метод генерирует миниатюру страницы динамически.
Создание встроенных миниатюр страниц
Встроенную миниатюру страницы можно создать с помощью метода
PdfPage.CreateThumbnail. Встроенные миниатюры всех страниц можно создать с помощью метода
PdfPageCollection.CreateThumbnails.
Вот C#/VB.NET код, который демонстрирует, как создать встроенную миниатюру указанной страницы:
/// <summary>
/// Creates an embedded thumbnail of PDF page.
/// </summary>
/// <param name="pdfFilename">The filename of PDF document.</param>
/// <param name="pageIndex">Index of PDF page.</param>
public static void CreateEmbeddedThumbnailOfPdfPage(string pdfFilename, int pageIndex)
{
// open PDF document in read-write mode
Vintasoft.Imaging.Pdf.PdfDocument document =
new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename);
// get the page at the specified index
Vintasoft.Imaging.Pdf.Tree.PdfPage page = document.Pages[pageIndex];
// renderer thumbnail with size 128 x 128 pixels
using (Vintasoft.Imaging.VintasoftImage pageThumbnail = page.Render(128, 128))
{
// set page thumbnail
page.Thumbnail = new Vintasoft.Imaging.Pdf.Tree.PdfImageResource(
document, pageThumbnail, Vintasoft.Imaging.Pdf.PdfCompression.Jpeg);
}
// save changes
document.SaveChanges();
// close document
document.Dispose();
}
''' <summary>
''' Creates an embedded thumbnail of PDF page.
''' </summary>
''' <param name="pdfFilename">The filename of PDF document.</param>
''' <param name="pageIndex">Index of PDF page.</param>
Public Shared Sub CreateEmbeddedThumbnailOfPdfPage(pdfFilename As String, pageIndex As Integer)
' open PDF document in read-write mode
Dim document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
' get the page at the specified index
Dim page As Vintasoft.Imaging.Pdf.Tree.PdfPage = document.Pages(pageIndex)
' renderer thumbnail with size 128 x 128 pixels
Using pageThumbnail As Vintasoft.Imaging.VintasoftImage = page.Render(128, 128)
' set page thumbnail
page.Thumbnail = New Vintasoft.Imaging.Pdf.Tree.PdfImageResource(document, pageThumbnail, Vintasoft.Imaging.Pdf.PdfCompression.Jpeg)
End Using
' save changes
document.SaveChanges()
' close document
document.Dispose()
End Sub
Удаление встроенных миниатюр страниц
Встроенную миниатюру страницы можно удалить с помощью метода
PdfPage.RemoveThumbnail. Встроенные миниатюры всех страниц можно удалить с помощью метода
PdfPageCollection.RemoveThumbnails.
Вот C#/VB.NET код, который демонстрирует, как сохранить встроенные миниатюры PDF страниц на диск и удалить встроенные миниатюры из PDF документа:
/// <summary>
/// Saves embedded thumnails of PDF document to files and
/// removes the embedded thumbnails from PDF document.
/// </summary>
/// <param name="pdfFilename">The filename of PDF document.</param>
public void SaveAndRemoveEmbeddedThumbnailsOfPdfDocument(string pdfFilename)
{
// open PDF document in read-write mode
Vintasoft.Imaging.Pdf.PdfDocument document =
new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename);
// get the page collection
Vintasoft.Imaging.Pdf.Tree.PdfPageCollection pages = document.Pages;
bool hasEmbeddedThumbnails = false;
// for each PDF page
for (int i = 0; i < pages.Count; i++)
{
// if page has embedded thumbnail
if (pages[i].Thumbnail != null)
{
// mark that PDF document has the embedded thumbnails for pages
hasEmbeddedThumbnails = true;
// get thumbnail as image
using (Vintasoft.Imaging.VintasoftImage img = pages[i].Thumbnail.GetImage())
{
// save image to a file
img.Save("page" + i.ToString() + "_thumb.png");
}
}
}
// if PDF document has the embedded thumbnails for pages
if (hasEmbeddedThumbnails)
{
// remove embedded thumbnailsfrom PDF document
document.Pages.RemoveThumbnails();
// save changes
document.SaveChanges();
}
// close document
document.Dispose();
}
''' <summary>
''' Saves embedded thumnails of PDF document to files and
''' removes the embedded thumbnails from PDF document.
''' </summary>
''' <param name="pdfFilename">The filename of PDF document.</param>
Public Sub SaveAndRemoveEmbeddedThumbnailsOfPdfDocument(pdfFilename As String)
' open PDF document in read-write mode
Dim document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
' get the page collection
Dim pages As Vintasoft.Imaging.Pdf.Tree.PdfPageCollection = document.Pages
Dim hasEmbeddedThumbnails As Boolean = False
' for each PDF page
For i As Integer = 0 To pages.Count - 1
' if page has embedded thumbnail
If pages(i).Thumbnail IsNot Nothing Then
' mark that PDF document has the embedded thumbnails for pages
hasEmbeddedThumbnails = True
' get thumbnail as image
Using img As Vintasoft.Imaging.VintasoftImage = pages(i).Thumbnail.GetImage()
' save image to a file
img.Save("page" & i.ToString() & "_thumb.png")
End Using
End If
Next
' if PDF document has the embedded thumbnails for pages
If hasEmbeddedThumbnails Then
' remove embedded thumbnailsfrom PDF document
document.Pages.RemoveThumbnails()
' save changes
document.SaveChanges()
End If
' close document
document.Dispose()
End Sub