Adding documents as attachments to PDF brings you a lot of convenience. For example, you can transfer multiple documents as a single document; you can open another file inside a PDF document without needing to find the document from other places; you reduce the possibility of losing documents referenced in the PDF document.
Spire.PDF for C++ allows you to attach files in two ways:
- Document Level Attachment (or Regular Attachment): A document-level attachment refers to the attachment that’s added to the Attachment tab and cannot be found on a specific page.
- Annotation Attachment: An annotation attachment refers to the attachment that’s 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 will show you how to add or delete regular attachments and annotation attachments in a PDF document in C++ using Spire.PDF for C++.
- Add a Regular Attachment to PDF in C++
- Add an Annotation Attachment to PDF in C++
- Delete Regular Attachments in PDF in C++
- Delete Annotation Attachments in PDF in C++
Install Spire.PDF for C++
There are two ways to integrate Spire.PDF for C++ into your application. One way is to install it through NuGet, and the other way is to download the package from our website and copy the libraries into your program. Installation via NuGet is simpler and more recommended. You can find more details by visiting the following link.
Integrate Spire.PDF for C++ in a C++ Application
Add a Regular Attachment to PDF in C++
To add a regular attachment, use PdfDocument->GetAttachments()->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->GetAttachments()->Add() method.
- Save the document to another PDF file using PdfDocument.SaveToFile() method.
- C++
#include "Spire.Pdf.o.h"; using namespace Spire::Pdf; using namespace std; int main() { //Specify input file path wstring inputPdfPath = L"C:\\Users\\Administrator\\Desktop\\Sample.pdf"; wstring inputFilePath = L"C:\\Users\\Administrator\\Desktop\\Data.xlsx"; //Specify output file path wstring outputFilePath = L"Output\\Attachment.pdf"; //Create a PdfDocument object PdfDocument* doc = new PdfDocument(); //Load a sample PDF file doc->LoadFromFile(inputPdfPath.c_str()); //Create a PdfAttachment object based on an external file PdfAttachment* attachment = new PdfAttachment(inputFilePath.c_str()); //Add the attachment to PDF doc->GetAttachments()->Add(attachment); //Save to file doc->SaveToFile(outputFilePath.c_str()); delete doc; }
Add an Annotation Attachment to PDF in C++
An annotation attachment is represented by the PdfAttachmentAnnotation class. You need to create an instance of the class based on an external file, and then add it to a specific page using PdfPageBase->GetAnnotationsWidget()->Add() method. The following are the detailed steps.
- Create a PdfDocument object.
- Load a PDF document using PdfDocument->LoadFromFile() method.
- Get a specific page to add annotation using PdfDocument->GetPages()->GetItem() method.
- Create a PdfAttachmentAnnotation object based on an external file.
- Add the annotation attachment to the page using PdfPageBase->GetAnnotationsWidget->Add() method.
- Save the document using PdfDocument->SaveToFile() method.
- C++
#include "Spire.Pdf.o.h"; using namespace Spire::Pdf; using namespace std; int main() { //Specify input file path wstring inputPdfPath = L"C:\\Users\\Administrator\\Desktop\\Attachment.pdf"; wstring inputFilePath = L"C:\\Users\\Administrator\\Desktop\\Report.docx"; //Specify output file path wstring outputFilePath = L"Output\\AnnotationAttachment.pdf"; //Create a PdfDocument object PdfDocument* doc = new PdfDocument(); //Load a sample PDF file doc->LoadFromFile(inputPdfPath.c_str()); //Get a specific page PdfPageBase* page = doc->GetPages()->GetItem(0); //Draw a label on PDF wstring label = L"Here is the report:"; PdfTrueTypeFont* font = new PdfTrueTypeFont(L"Arial", 13.0f, PdfFontStyle::Bold, true); float x = 35; float y = doc->GetPages()->GetItem(0)->GetActualSize()->GetHeight() - 220; page->GetCanvas()->DrawString(label.c_str(), font, PdfBrushes::GetRed(), x, y); //Convert the file to be attached to stream ifstream is1(inputFilePath.c_str(), ifstream::in | ios::binary); is1.seekg(0, is1.end); int length1 = is1.tellg(); is1.seekg(0, is1.beg); char* buffer1 = new char[length1]; is1.read(buffer1, length1); Stream* stream = new Spire::Common::Stream((unsigned char*)buffer1, length1); SizeF* size = font->MeasureString(label.c_str()); RectangleF* bounds = new RectangleF((float)(x + size->GetWidth() + 5), (float)y, 10, 15); //Create a PdfAttachmentAnnotation object based on the file PdfAttachmentAnnotation* annotation = new PdfAttachmentAnnotation(bounds, L"Report.docx", stream); annotation->SetColor(new PdfRGBColor(Spire::Common::Color::GetDarkOrange())); annotation->SetFlags(PdfAnnotationFlags::ReadOnly); annotation->SetIcon(PdfAttachmentIcon::Graph); annotation->SetText(L"Click here to open the file"); //Add the attachment annotation to PDF page->GetAnnotationsWidget()->Add(annotation); //Save to file doc->SaveToFile(outputFilePath.c_str()); delete doc; }
Delete Regular Attachments in PDF in C++
The PdfDocument->GetAttachments() method returns a collection of regular attachments of a PDF document. A specific attachment or all attachments can be removed by using PdfAttachmentCollection->RemoveAt() method or PdfAttachmentCollection->Clear() method. 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 using PdfDocument->GetAttachments() method.
- Remove a specific attachment using PdfAttachmentCollection->RemoveAt() method. To remove all attachments at once, use PdfAttachmentCollection->Clear() method.
- Save the document using PdfDocument->SaveToFile() method.
- C++
#include "Spire.Pdf.o.h"; using namespace Spire::Pdf; using namespace std; int main() { //Specify input file path wstring inputPdfPath = L"C:\\Users\\Administrator\\Desktop\\Sample.pdf"; //Specify output file path wstring outputFilePath = L"Output\\DeleteAttachments.pdf"; //Create a PdfDocument object PdfDocument* doc = new PdfDocument(); //Load a PDF file doc->LoadFromFile(inputPdfPath.c_str()); //Get all attachments PdfAttachmentCollection* attachments = doc->GetAttachments(); //Delete all attachments attachments->Clear(); //Delete a specific attachment //attachments->RemoveAt(0); //Save the document doc->SaveToFile(outputFilePath.c_str()); doc->Close(); delete doc; }
Delete Annotation Attachments in PDF in C++
The annotation is a page-based element. You can get annotations from a specific page using PdfPageBase->GetAnnotationsWidget() method, and determine if a certain annotation is an annotation attachment. After that, remove the annotation attachment from the annotation collection using PdfAnnotationCollection->Remove() method. The following are the detailed steps.
- Create a PdfDocument object.
- Load a PDF document using PdfDocument->LoadFromFile() method.
- Get the annotation collection from a specific page using PdfPageBase->GetAnnotationsWidget() method.
- Determine if an annotation is an instance of PdfAttachmentAnnotationWidget. If yes, remove the annotation attachment using PdfAnnotationCollection->Remove() method.
- Save the document using PdfDocument->SaveToFile() method.
- C++
#include "Spire.Pdf.o.h"; using namespace Spire::Pdf; using namespace std; int main() { //Specify input file path wstring inputPdfPath = L"C:\\Users\\Administrator\\Desktop\\AnnotationAttachment.pdf"; //Specify output file path wstring outputFilePath = L"Output\\DeleteAnnotationAttachments.pdf"; //Create a PdfDocument object PdfDocument* doc = new PdfDocument(); //Load a PDF file doc->LoadFromFile(inputPdfPath.c_str()); //Loop through the pages for (int i = 0; i < doc->GetPages()->GetCount(); i++) { //Get the annotation collection PdfAnnotationCollection* annotationCollection = doc->GetPages()->GetItem(i)->GetAnnotationsWidget(); //Loop through the annotations for (int j = 0; j < annotationCollection->GetCount(); j++) { //Get a specific annotation PdfAnnotation* annotation = annotationCollection->GetItem(j); //Determine if the annotation is an instance of PdfAttachmentAnnotationWidget wstring content; wchar_t nm_w[100]; swprintf(nm_w, 100, L"%hs", typeid(PdfAttachmentAnnotationWidget).name()); LPCWSTR_S newName = nm_w; if (wcscmp(newName, annotation->GetInstanceTypeName()) == 0) { //Remove the annotation attachment annotationCollection->RemoveAt(j); } } } //Save the document doc->SaveToFile(outputFilePath.c_str()); doc->Close(); delete doc; }
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.