Knowledgebase (2330)
Children categories
Besides text and graphics, PDF files can contain entire files inside them as attachments. This makes the exchange of sets of documents much easier and more reliable. Spire.PDF allows you to attach files in two ways:
- Document Level Attachment: A file attached to a PDF at the document level won't appear on a page, but can only be viewed in the "Attachments" panel of a PDF reader.
- Annotation Attachment: A file will be added to a specific position of a page. Annotation attachments are shown as a paper clip icon on the page; reviewers can double-click the icon to open the file.
This article demonstrates how to add or remove these two types of attachments in a PDF document in C# and VB.NET using Spire.PDF for .NET.
- Add an Attachment to PDF in C# and VB.NET
- Add an Annotation Attachment to PDF in C# and VB.NET
- Remove Attachments from PDF in C# and VB.NET
- Remove Annotation Attachments from PDF in C# and VB.NET
Install Spire.PDF for .NET
To begin with, you need to add the DLL files included in the Spire.PDF for.NET package as references in your .NET project. The DLLs files can be either downloaded from this link or installed via NuGet.
PM> Install-Package Spire.PDF
Add an Attachment to PDF in C# and VB.NET
Adding an attachment to the "Attachments" panel can be easily done by using PdfDocument.Attachments.Add() method. The following are the detailed steps.
- Create a PdfDocument object.
- Load a PDF document using PdfDocument.LoadFromFile() method.
- Create a PdfAttachment object based on an external file.
- Add the attachment to PDF using PdfDocument.Attachments.Add() method.
- Save the document to another PDF file using PdfDocument.SaveToFile() method.
- C#
- VB.NET
using Spire.Pdf;
using Spire.Pdf.Attachments;
namespace AttachFilesToPDF
{
class Program
{
static void Main(string[] args)
{
//Create a PdfDocument object
PdfDocument doc = new PdfDocument();
//Load a sample PDF file
doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Sample.pdf");
//Create a PdfAttachment object based on an external file
PdfAttachment attachment = new PdfAttachment("C:\\Users\\Administrator\\Desktop\\Data.xlsx");
//Add the attachment to PDF
doc.Attachments.Add(attachment);
//Save to file
doc.SaveToFile("Attachment.pdf");
}
}
}

Add an Annotation Attachment to PDF in C# and VB.NET
An annotation attachment can be found in the "Attachments" panel as well as on a specific page. Below are the steps to add an annotation attachment to PDF using Spire.PDF for .NET.
- Create a PdfDocument object.
- Load a PDF document using PdfDocument.LoadFromFile() method.
- Get a specific page to add annotation through PdfDocument.Pages[] property.
- Create a PdfAttachmentAnnotation object based on an external file.
- Add the annotation attachment to the page using PdfPageBase.AnnotationsWidget.Add() method.
- Save the document to another PDF file using PdfDocument.SaveToFile() method.
- C#
- VB.NET
using Spire.Pdf;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using System;
using System.Drawing;
using System.IO;
namespace AnnotationAttachment
{
class Program
{
static void Main(string[] args)
{
//Create a PdfDocument object
PdfDocument doc = new PdfDocument();
//Load a sample PDF file
doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Sample.pdf");
//Get a specific page
PdfPageBase page = doc.Pages[0];
//Draw a label on PDF
String label = "Here is the report:";
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", 13f, FontStyle.Bold), true);
float x = 35;
float y = doc.Pages[0].ActualSize.Height - 220;
page.Canvas.DrawString(label, font, PdfBrushes.Red, x, y);
//Create a PdfAttachmentAnnotation object based on an external file
String filePath = "C:\\Users\\Administrator\\Desktop\\Report.pptx";
byte[] data = File.ReadAllBytes(filePath);
SizeF size = font.MeasureString(label);
RectangleF bounds = new RectangleF((float)(x + size.Width + 5), (float)y, 10, 15);
PdfAttachmentAnnotation annotation = new PdfAttachmentAnnotation(bounds, "Report.docx", data);
annotation.Color = Color.Purple;
annotation.Flags = PdfAnnotationFlags.Default;
annotation.Icon = PdfAttachmentIcon.Graph;
annotation.Text = "Click here to open the file";
//Add the attachment annotation to PDF
page.AnnotationsWidget.Add(annotation);
//Save to file
doc.SaveToFile("Annotation.pdf");
}
}
}

Remove Attachments from PDF in C# and VB.NET
The attachments of a PDF document can be accessed by the PdfDocument.Attachments property, and can be removed by using RemoveAt() method or Clear() method of the PdfAttachmentCollection object. The detailed steps are as follows.
- Create a PdfDocument object.
- Load a PDF document using PdfDocument.LoadFromFile() method.
- Get the attachment collection from the document through PdfDocument.Attachments property.
- Remove a specific attachment using PdfAttachmentCollection.RemoveAt() method. To remove all attachments at once, use PdfAttachmentCollection.Clear() method.
- Save the document to another PDF file using PdfDocument.SaveToFile() method.
- C#
- VB.NET
using Spire.Pdf;
using Spire.Pdf.Attachments;
namespace RemoveAttachments
{
class Program
{
static void Main(string[] args)
{
//Create a PdfDocument object
PdfDocument doc = new PdfDocument();
//Load a PDF file
doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Attachment.pdf");
//Get attachment collection
PdfAttachmentCollection attachments = doc.Attachments;
//Remove a specific attachment
attachments.RemoveAt(0);
//Remove all attachments
//attachments.Clear();
//save to file
doc.SaveToFile("DeleteAttachments.pdf");
}
}
}
Remove Annotation Attachments from PDF in C# and VB.NET
Annotation is a page-based element. To get all annotations from a document, we must traverse through the pages and get the annotations from each page. Then determine if a certain annotation is an annotation attachment. Lastly, remove the annotation attachment from the annotation collection using Remove() method. The following are the detailed steps.
- Create a PdfDocument object.
- Load a PDF document using PdfDocument.LoadFromFile() method.
- Loop through the pages in the document, and get the annotation collection from a specific page through PdfDocument.Pages[].AnnotationsWidget property.
- Determine if an annotation is an instance of PdfAttachmentAnnotationWidget. If yes, remove the annotation attachment using PdfAnnotationCollection.Remove() method.
- Save the document to another PDF file using PdfDocument.SaveToFile() method.
- C#
- VB.NET
using Spire.Pdf;
using Spire.Pdf.Annotations;
namespace RemoveAnnotationAttachments
{
class Program
{
static void Main(string[] args)
{
//Create a PdfDocument object
PdfDocument doc = new PdfDocument();
//Load a PDF file
doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Annotation.pdf");
//Loop through the pages
for (int i = 0; i < doc.Pages.Count; i++)
{
//Get the annotation collection
PdfAnnotationCollection annotationCollection = doc.Pages[i].AnnotationsWidget;
//Loop through the annotations
for (int j = 0; j < annotationCollection.Count; j++)
{
//Determine if an annotation is an instance of PdfAttachmentAnnotationWidget
if (annotationCollection[j] is PdfAttachmentAnnotationWidget)
{
//Remove the annotation attachment
annotationCollection.Remove((PdfAnnotation)annotationCollection[j]);
}
}
}
//Save to file
doc.SaveToFile("DeleteAnnotationAttachments.pdf");
}
}
}
Apply for a Temporary License
If you'd like to remove the evaluation message from the generated documents, or to get rid of the function limitations, please request a 30-day trial license for yourself.
A list is a collection of related values written one after another. Lists are the best tool to make important information stand out on the page, show the steps in a process, or present an overview to the readers. In this article, you will learn how to create ordered or unordered lists in a PDF document in C# and VB.NET using Spire.PDF for .NET.
- Create an Ordered List in PDF
- Create an Unordered List with Symbol Bullets in PDF
- Create an Unordered List with Image Bullets in PDF
- Create a Nested Numbered List in PDF
Spire.PDF provides the PdfSortedList class and the PdfList class to represent the ordered lists and unordered lists, respectively. To set the list's content, indent, font, marker style and other attributes, use the methods, properties, or events under these two classes. The following table lists some of the core items involved in this tutorial.
| Member | Description |
| PdfSortedList class | Represents an ordered list in a PDF document. |
| PdfList class | Represents an unordered list in a PDF document. |
| Brush property | Gets or sets a list's brush. |
| Font property | Gets or sets a list's font. |
| Indent property | Gets or sets a list's indent. |
| TextIndent property | Gets or sets the indent from the marker to the list item text. |
| Items property | Gets items of a list. |
| Marker property | Gets or sets the marker of a list. |
| Draw() method | Draw list on the canvas of a page at the specified location. |
| PdfOrderedMarker class | Represents the marker style of an ordered list, such as numbers, letters, and roman numerals. |
| PdfMarker class | Represents bullet style for an unordered list. |
Install Spire.PDF for .NET
To begin with, you need to add the DLL files included in the Spire.PDF for.NET package as references in your .NET project. The DLL files can be either downloaded from this link or installed via NuGet.
PM> Install-Package Spire.PDF
Create an Ordered List in PDF
An ordered list is a container which holds a sequence of objects. Each item in the list is marked with a number, a letter, or a roman numeral. The following are the step to create an ordered list in PDF using Spire.PDF for .NET.
- Create a PdfDocument object.
- Add a page to it using PdfDocument.Pages.Add() method.
- Create PdfBrush and PdfFont objects for the list.
- Create a PdfOrderedMarker object, specifying the marker style.
- Specify the list content with a string, and create an object of PdfSortedList class based on the string.
- Set the font, indent, brush and marker of the list though the properties under the PdfSortedList object.
- Draw the list on the page at the specified location using PdfSortedList.Draw() method.
- Save the document to another file using PdfDocument.SaveToFile() method.
- C#
- VB.NET
using System;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Lists;
namespace CreateOrderedList
{
class Program
{
static void Main(string[] args)
{
//Create a PdfDocument object
PdfDocument doc = new PdfDocument();
//Set the margins
PdfMargins margins = new PdfMargins(30);
//Add a page
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, margins);
//Create a brush
PdfBrush brush = PdfBrushes.Black;
//Create fonts
PdfFont titleFont = new PdfFont(PdfFontFamily.TimesRoman, 12f, PdfFontStyle.Bold);
PdfFont listFont = new PdfFont(PdfFontFamily.TimesRoman, 12f, PdfFontStyle.Regular);
//Create a maker for ordered list
PdfOrderedMarker marker = new PdfOrderedMarker(PdfNumberStyle.LowerLatin, listFont);
//Specify the initial coordinate
float x = 10;
float y = 20;
//Draw title
String title = "Required Web Development Skills:";
page.Canvas.DrawString(title, titleFont, brush, x, y);
y = y + (float)titleFont.MeasureString(title).Height;
y = y + 5;
//Create a numbered list
String listContent = "Command-line Unix\n"
+ "Vim\n"
+ "HTML\n"
+ "CSS\n"
+ "Python\n"
+ "JavaScript\n"
+ "SQL";
PdfSortedList list = new PdfSortedList(listContent);
//Set the font, indent, text indent, brush of the list
list.Font = listFont;
list.Indent = 2;
list.TextIndent = 4;
list.Brush = brush;
list.Marker = marker;
//Draw list on the page at the specified location
list.Draw(page, x, y);
//Save to file
doc.SaveToFile("OrderedList.pdf");
}
}
}

Create an Unordered List with Symbol Bullets in PDF
An unordered list, also named bulleted list, is a collection of related items that have no special order or sequence. Each item in the list is marked with a bullet. The following are the step to create an unordered list in PDF using Spire.PDF for .NET.
- Create a PdfDocument object.
- Add a page to it using PdfDocument.Pages.Add() method.
- Create PdfBrush and PdfFont objects for the list.
- Create a PdfMarker object, specifying the marker style.
- Specify the list content with a string, and create an object of PdfList class based on the string.
- Set the font, indent, brush and marker of the list though the properties under the PdfList object.
- Draw the list on the page at the specified location using PdfList.Draw() method.
- Save the document to another file using PdfDocument.SaveToFile() method.
- C#
- VB.NET
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Lists;
using System;
namespace CreateBulletedList
{
class Program
{
static void Main(string[] args)
{
//Create a PdfDocument object
PdfDocument doc = new PdfDocument();
//Set the margin
PdfMargins margin = new PdfMargins(30);
//Add a page
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, margin);
//Create fonts
PdfFont titleFont = new PdfFont(PdfFontFamily.TimesRoman, 12f, PdfFontStyle.Bold);
PdfFont listFont = new PdfFont(PdfFontFamily.TimesRoman, 12f, PdfFontStyle.Regular);
PdfFont markerFont = new PdfFont(PdfFontFamily.TimesRoman, 6f, PdfFontStyle.Regular);
//Create a brush
PdfBrush brush = PdfBrushes.Black;
//Specify the initial coordinate
float x = 10;
float y = 20;
//Draw title
String title = "Computer Science Subjects:";
page.Canvas.DrawString(title, titleFont, brush, x, y);
y = y + (float)titleFont.MeasureString(title).Height;
y = y + 5;
//Specify the marker style
PdfMarker marker = new PdfMarker(PdfUnorderedMarkerStyle.Asterisk);
marker.Font = markerFont;
//Create an unordered list
String listContent = "Data Structure\n"
+ "Algorithm\n"
+ "Computer Networks\n"
+ "Operating System\n"
+ "Theory of Computations\n"
+ "C Programming\n"
+"Computer Organization and Architecture";
PdfList list = new PdfList(listContent);
//Set the font, indent, text indent, brush, maker of the list
list.Font = listFont;
list.Indent = 2;
list.TextIndent = 4;
list.Brush = brush;
list.Marker = marker;
//Draw list on a page at the specified location
list.Draw(page, x, y);
//Save to file
doc.SaveToFile("UnorderedList.pdf");
}
}
}

Create an Unordered List with Image Bullets in PDF
In addition to symbols, the bullet points of an unordered list can be also a picture. The steps to create an unordered list with images bullets are as follows.
- Create a PdfDocument object.
- Add a page to it using PdfDocument.Pages.Add() method.
- Create PdfBrush and PdfFont objects for the list.
- Create a PdfMarker object, setting the marker style as CustomImage.
- Set an image as the mark through PdfMarker.Image property.
- Specify the list content with a string, and create an object of PdfList class based on the string.
- Set the font, indent, brush and marker of the list though the properties under the PdfList object.
- Draw the list on the page at the specified location using PdfList.Draw() method.
- Save the document to another file using PdfDocument.SaveToFile() method.
- C#
- VB.NET
using System;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Lists;
namespace CustomizeBulletPointsWithImage
{
class Program
{
static void Main(string[] args)
{
//Create a PdfDocument object
PdfDocument doc = new PdfDocument();
//Set the margin
PdfMargins margin = new PdfMargins(30);
//Add a page
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, margin);
//Create fonts
PdfFont titleFont = new PdfFont(PdfFontFamily.TimesRoman, 12f, PdfFontStyle.Bold);
PdfFont listFont = new PdfFont(PdfFontFamily.TimesRoman, 12f, PdfFontStyle.Regular);
//Create a brush
PdfBrush brush = PdfBrushes.Black;
//Specify the initial coordinate
float x = 10;
float y = 20;
//Draw title
String title = "Project Task To-Do List:";
page.Canvas.DrawString(title, titleFont, brush, x, y);
y = y + (float)titleFont.MeasureString(title).Height;
y = y + 5;
//Specify the marker style to image
PdfMarker marker = new PdfMarker(PdfUnorderedMarkerStyle.CustomImage);
//Set the image for the marker
marker.Image = PdfImage.FromFile(@"C:\Users\Administrator\Desktop\checkmark.jpg");
//Create an unordered list
String listContent = "Define projects and tasks you're working on\n"
+ "Assign people to tasks\n"
+ "Define the priority levels of your tasks\n"
+ "Keep track of the progress status of your tasks\n"
+ "Mark tasks as done when completed";
PdfList list = new PdfList(listContent);
//Set the font, indent, text indent, brush, maker of the list
list.Font = listFont;
list.Indent = 2;
list.TextIndent = 4;
list.Brush = brush;
list.Marker = marker;
//Draw list on a page at the specified location
list.Draw(page, x, y);
//Save to file
doc.SaveToFile("ImageBullets.pdf");
}
}
}

Create a Nested Numbered List in PDF
A nested list is a list that contains at least one sub list. Nested lists are used to present data in hierarchical structures. The following are the steps to create a nested numbered list in PDF using Spire.PDF for .NET.
- Create a PdfDocument object.
- Add a page to it using PdfDocument.Pages.Add() method.
- Create a PdfOrderedMarker object, specifying the marker style as Numeric.
- Specify the list content with a string, and create a parent list based on the string. And then set the font, indent, brush and marker of the list though the properties under the PdfSortedList object.
- Repeat the above step to create sub lists and sub-sub lists.
- Get the specific item of the parent list through PdfSortedList.Items[] property, and add a list to it as its sub list through PdfListItem.Sublist property.
- Draw the list on the page at the specified location using PdfSortedList.Draw() method.
- Save the document to another file using PdfDocument.SaveToFile() method.
- C#
- VB.NET
using System;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Lists;
namespace CreateMultiLevelLists
{
class Program
{
static void Main(string[] args)
{
//Create a PdfDocument object
PdfDocument doc = new PdfDocument();
//Set the margin
PdfMargins margin = new PdfMargins(30);
//Add a page
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, margin);
//Specify the initial coordinate
float x = 10;
float y = 20;
//Create two brushes
PdfBrush blackBrush = PdfBrushes.Black;
PdfBrush purpleBrush = PdfBrushes.Purple;
//Create two fonts
PdfFont titleFont = new PdfFont(PdfFontFamily.TimesRoman, 12f, PdfFontStyle.Bold);
PdfFont listFont = new PdfFont(PdfFontFamily.TimesRoman, 12f, PdfFontStyle.Regular);
//Create a maker for ordered list
PdfOrderedMarker marker = new PdfOrderedMarker(PdfNumberStyle.Numeric, listFont);
//Draw title
String title = "Below is a Nested Numbered List:";
page.Canvas.DrawString(title, titleFont, blackBrush, x, y);
y = y + (float)titleFont.MeasureString(title).Height;
y = y + 5;
//Create a parent list
String parentListContent = "Parent Item 1\n"
+ "Parent Item 2";
PdfSortedList parentList = new PdfSortedList(parentListContent);
parentList.Font = listFont;
parentList.Indent = 2;
parentList.Brush = purpleBrush;
parentList.Marker = marker;
//Create a sub list - "subList_1"
String subListContent_1 = "Sub Item 1\n"
+ "Sub Item 2\n"
+ "Sub Item 3\n"
+ "Sub Item 4";
PdfSortedList subList_1 = new PdfSortedList(subListContent_1);
subList_1.Indent = 12;
subList_1.Font = listFont;
subList_1.Brush = blackBrush;
subList_1.Marker = marker;
subList_1.MarkerHierarchy = true;
//Create another sub list -"subList_2"
String subListContent_2 = "Sub Item 1\n"
+ "Sub Item 2\n"
+ "Sub Item 3";
PdfSortedList subList_2 = new PdfSortedList(subListContent_2);
subList_2.Indent = 12;
subList_2.Font = listFont;
subList_2.Brush = blackBrush;
subList_2.Marker = marker;
subList_2.MarkerHierarchy = true;
//Create a sub-sub list - "subList_1"
String subSubListContent_1 = "Sub Sub Item 1\n"
+ "Sub Sub Item 2";
PdfSortedList subSubList = new PdfSortedList(subSubListContent_1);
subSubList.Indent = 20;
subSubList.Font = listFont;
subSubList.Brush = blackBrush;
subSubList.Marker = marker;
subSubList.MarkerHierarchy = true;
//Set subList_1 as sub list of the first item of parent list
PdfListItem item_1 = parentList.Items[0];
item_1.SubList = subList_1;
//Set subList_2 as sub list of the second item of parent list
PdfListItem item_2 = parentList.Items[1];
item_2.SubList = subList_2;
//Set subSubList as sub list of the first item of subList_1
PdfListItem item_1_1 = subList_1.Items[0];
item_1_1.SubList = subSubList;
//Draw parent list
parentList.Draw(page, x, y);
//Save to file
doc.SaveToFile("MultiLevelList.pdf");
}
}
}

Apply for a Temporary License
If you'd like to remove the evaluation message from the generated documents, or to get rid of the function limitations, please request a 30-day trial license for yourself.
Word endnote is often put in the end of the document, which presents references of referred words/sentences/paragraphs. It includes two parts, marker and text. Marker can be customized or ordered automatically (i, ii, iii…). When one endnote is added, deleted or moved, the marker will be reordered automatically.
Spire.Doc for .NET, a stand-alone component used to manipulate Word document for .NET applications, enables users to insert endnote in Word by using C#, VB.NET. This guide introduces a method about how to realize this function via Spire.Doc for .NET.
Because endnote is included in footnote class, so invoke p.AppendFootnote(FootnoteType.Endnote) method to insert endnote. Then, use endnote.TextBody.AddParagraph().AppendText(string) method to add text and set CharacterFormat and MarkerCharacterFormat properties for endnote text and marker format. Download and install Spire.Doc for .NET and use the following code to insert endnote in Word.

using System.Drawing;
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
namespace WordEndnote
{
class InsertEndnote
{
static void Main(string[] args)
{
//Load Document
Document doc = new Document();
doc.LoadFromFile(@"E:\Work\Documents\WordDocuments\Antarctic.docx", FileFormat.Docx);
Section s = doc.Sections[0];
Paragraph p = s.Paragraphs[3];
//Add Footnote
Footnote endnote = p.AppendFootnote(FootnoteType.Endnote);
//Append Text
TextRange text = endnote.TextBody.AddParagraph().AppendText("Reference: Wikipedia");
//Text Format
text.CharacterFormat.FontName = "Impact";
text.CharacterFormat.FontSize = 14;
text.CharacterFormat.TextColor = Color.DarkOrange;
//Marker Format
endnote.MarkerCharacterFormat.FontName = "Calibri";
endnote.MarkerCharacterFormat.FontSize = 14;
endnote.MarkerCharacterFormat.TextColor = Color.DarkBlue;
//Save and Launch
doc.SaveToFile("Endnote.docx", FileFormat.Docx);
System.Diagnostics.Process.Start("Endnote.docx");
}
}
}
Imports System.Drawing
Imports Spire.Doc
Imports Spire.Doc.Documents
Imports Spire.Doc.Fields
Namespace WordEndnote
Friend Class InsertEndnote
Shared Sub Main(ByVal args() As String)
'Load Document
Dim doc As New Document()
doc.LoadFromFile("E:\Work\Documents\WordDocuments\Antarctic.docx", FileFormat.Docx)
Dim s As Section = doc.Sections(0)
Dim p As Paragraph = s.Paragraphs(3)
'Add Footnote
Dim endnote As Footnote = p.AppendFootnote(FootnoteType.Endnote)
'Append Text
Dim text As TextRange = endnote.TextBody.AddParagraph().AppendText("Reference: Wikipedia")
'Text Format
text.CharacterFormat.FontName = "Impact"
text.CharacterFormat.FontSize = 14
text.CharacterFormat.TextColor = Color.DarkOrange
'Marker Format
endnote.MarkerCharacterFormat.FontName = "Calibri"
endnote.MarkerCharacterFormat.FontSize = 14
endnote.MarkerCharacterFormat.TextColor = Color.DarkBlue
'Save and Launch
doc.SaveToFile("Endnote.docx", FileFormat.Docx)
System.Diagnostics.Process.Start("Endnote.docx")
End Sub
End Class
End Namespace
Spire.Doc is a Microsoft Word component, which enables users to perform a wide range of Word document processing tasks directly, such as generate, read, write and modify Word document in WPF, .NET and Silverlight.