PDF form fields are digital elements that allow users to input and manipulate data within a PDF document. PDF form fields enable users to complete forms, surveys, questionnaires, and other types of documents electronically, which streamlines the process of data collection and eliminates the need for paper-based methods. In this article, you will learn how to create, fill, or remove form fields in a PDF document in C++ using Spire.PDF for 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

Create Form Fields in PDF in C++

Spire.PDF for C++ offers a set of useful classes that allow developers to create and edit various types of form fields in PDF, including text box, check box, combo box, list box, and radio button. The table below lists some of the core classes involved in this tutorial.

Class Description
PdfForm Represents interactive form of the PDF document.
PdfField Represents field of the PDF document's interactive form.
PdfTextBoxField Represents text box field in the PDF form.
PdfCheckBoxField Represents check box field in the PDF form.
PdfComboBoxField Represents combo box field in the PDF Form.
PdfListBoxField Represents list box field of the PDF form.
PdfListFieldItem Represents an item of a list field.
PdfRadioButtonListField Represents radio button field in the PDF form.
PdfRadioButtonListItem Represents an item of a radio button list.
PdfButtonField Represents button field in the PDF form.
PdfSignatureField Represents signature field in the PDF form.

To create a field, initialize an instance of the corresponding class. Specify its size and position in the document using SetBounds() method, and then add it to the PDF form using PdfForm->GetFields()->Add() method. The following are the steps to create various types of form fields in a PDF document using Spire.PDF for C++.

  • Create a PdfDocument object.
  • Add a page using PdfDocument->GetPages()->Add() method.
  • Create a PdfTextBoxField object, set the properties of the field including Bounds, Font and Text, and then add it to the document using PdfForm->GetFields()->Add() method.
  • Repeat the step 3 to add check boxes, combo boxes, list boxes, radio buttons, and buttons to the document.
  • Save the document to a PDF file using PdfDocument->SaveToFile() method.
  • C++
#include "Spire.Pdf.o.h";

using namespace Spire::Pdf;
using namespace std;

int main() {

    //Create a PdfDocument object
    PdfDocument* doc = new PdfDocument();

    //Add a page
    intrusive_ptr<PdfPageBase> page = doc->GetPages()->Add();

    //Initialize x and y coordinates
    float baseX = 100;
    float baseY = 30;

    //Create two brush objects
    PdfSolidBrush* brush1 = new PdfSolidBrush(new PdfRGBColor(Spire::Pdf::Color::GetBlue()));
    PdfSolidBrush* brush2 = new PdfSolidBrush(new PdfRGBColor(Spire::Pdf::Color::GetBlack()));

    //Create a font
    PdfFont * font = new PdfFont(PdfFontFamily::TimesRoman, 12.0f, PdfFontStyle::Regular);

    //Add a textbox
    page->GetCanvas()->DrawString(L"TextBox:", font, brush1, 10, baseY);
    RectangleF* tbxBounds = new RectangleF(baseX, baseY, 150, 15);
    PdfTextBoxField* textBox = new PdfTextBoxField(page, L"textbox");
    textBox->SetBounds(tbxBounds);
    textBox->SetText(L"Hello World");
    textBox->SetFont(font);
    doc->GetForm()->GetFields()->Add(textBox);
    baseY += 25;

    //add two checkboxes
    page->GetCanvas()->DrawString(L"CheckBox:", font, brush1, 10, baseY);
    RectangleF* checkboxBound1 = new RectangleF(baseX, baseY, 15, 15);
    PdfCheckBoxField* checkBoxField1 = new PdfCheckBoxField(page, L"checkbox1");
    checkBoxField1->SetBounds(checkboxBound1);
    checkBoxField1->SetChecked(false);
    page->GetCanvas()->DrawString(L"Option 1", font, brush2, baseX + 20, baseY);

    RectangleF* checkboxBound2 = new RectangleF(baseX + 70, baseY, 15, 15);
    PdfCheckBoxField* checkBoxField2 = new PdfCheckBoxField(page, L"checkbox2");
    checkBoxField2->SetBounds(checkboxBound2);
    checkBoxField2->SetChecked(false);
    page->GetCanvas()->DrawString(L"Option 2", font, brush2, baseX + 90, baseY);
    doc->GetForm()->GetFields()->Add(checkBoxField1);
    doc->GetForm()->GetFields()->Add(checkBoxField2);
    baseY += 25;

    //Add a listbox
    page->GetCanvas()->DrawString(L"ListBox:", font, brush1, 10, baseY);
    RectangleF* listboxBound = new RectangleF(baseX, baseY, 150, 50);
    PdfListBoxField* listBoxField = new PdfListBoxField(page, L"listbox");
    listBoxField->GetItems()->Add(new PdfListFieldItem(L"Item 1", L"item1"));
    listBoxField->GetItems()->Add(new PdfListFieldItem(L"Item 2", L"item2"));
    listBoxField->GetItems()->Add(new PdfListFieldItem(L"Item 3", L"item3")); ;
    listBoxField->SetBounds(listboxBound);
    listBoxField->SetFont(font);
    listBoxField->SetSelectedIndex(0);
    doc->GetForm()->GetFields()->Add(listBoxField);
    baseY += 60;

    //Add two radio buttons
    page->GetCanvas()->DrawString(L"RadioButton:", font, brush1, 10, baseY);
    PdfRadioButtonListField* radioButtonListField = new PdfRadioButtonListField(page, L"radio");
    PdfRadioButtonListItem* radioItem1 = new PdfRadioButtonListItem(L"option1");
    RectangleF* radioBound1 = new RectangleF(baseX, baseY, 15, 15);
    radioItem1->SetBounds(radioBound1);
    page->GetCanvas()->DrawString(L"Option 1", font, brush2, baseX + 20, baseY);

    PdfRadioButtonListItem* radioItem2 = new PdfRadioButtonListItem(L"option2");
    RectangleF* radioBound2 = new RectangleF(baseX + 70, baseY, 15, 15);
    radioItem2->SetBounds(radioBound2);
    page->GetCanvas()->DrawString(L"Option 2", font, brush2, baseX + 90, baseY);
    radioButtonListField->GetItems()->Add(radioItem1);
    radioButtonListField->GetItems()->Add(radioItem2);
    radioButtonListField->SetSelectedIndex(0);
    doc->GetForm()->GetFields()->Add(radioButtonListField);
    baseY += 25;

    //Add a combobox
    page->GetCanvas()->DrawString(L"ComboBox:", font, brush1, 10, baseY);
    RectangleF* cmbBounds = new RectangleF(baseX, baseY, 150, 15);
    PdfComboBoxField* comboBoxField = new PdfComboBoxField(page, L"combobox");
    comboBoxField->SetBounds(cmbBounds);
    comboBoxField->GetItems()->Add(new PdfListFieldItem(L"Item 1", L"item1"));
    comboBoxField->GetItems()->Add(new PdfListFieldItem(L"Item 2", L"itme2"));
    comboBoxField->GetItems()->Add(new PdfListFieldItem(L"Item 3", L"item3"));
    comboBoxField->GetItems()->Add(new PdfListFieldItem(L"Item 4", L"item4"));
    comboBoxField->SetSelectedIndex(0);
    comboBoxField->SetFont(font);
    comboBoxField->SetEditable(true);
    doc->GetForm()->GetFields()->Add(comboBoxField);
    baseY += 25;

    //Add a button
    page->GetCanvas()->DrawString(L"Button:", font, brush1, 10, baseY);
    RectangleF* btnBounds = new RectangleF(baseX, baseY, 50, 15);
    PdfButtonField* buttonField = new PdfButtonField(page, L"button");
    buttonField->SetBounds(btnBounds);
    buttonField->SetText(L"Submit");
    buttonField->SetFont(font);
    PdfSubmitAction* submitAction = new PdfSubmitAction(L"https://www.e-iceblue.com/getformvalues.php");
    buttonField->GetActions()->SetMouseDown(submitAction);
    doc->GetForm()->GetFields()->Add(buttonField);

    //Save to file
    doc->SaveToFile(L"Output/FillableForm.pdf", FileFormat::PDF);
    doc->Close();
    delete doc;
}

C++: Create, Fill or Remove Form Fields in PDF

Fill Form Fields in PDF in C++

In order to fill out a form, you need first get all the form fields from the PDF document, determine the type of a certain field, and then input a value or select a value from a predefined list. The following are the steps to fill form fields in an existing PDF document using Spire.PDF for C++.

  • Create a PdfDocument object.
  • Load a sample PDF document using PdfDocument->LoadFromFile() method.
  • Get the form from the document using PdfDocument->GetForm() method.
  • Get the form field widget collection using PdfFormWidget->GetFieldsWidget() method.
  • Loop through the field widget collection to get a specific PdfField.
  • Determine if the PdfField is a certain field type such as text box. If yes, set the text of the text box using PdfTextBoxFieldWidget->SetText() method.
  • Repeat the step above to fill radio button, check box, combo box, and list box with values.
  • Save the document to a PDF file using PdfDocument->SaveToFile() method.
  • C++
#include "Spire.Pdf.o.h";

using namespace Spire::Pdf;
using namespace std;

int main() {

    //Create a PdfDocument object
    PdfDocument* doc = new PdfDocument();

    //Load a PDF file containing form fields
    doc->LoadFromFile(L"C:\\Users\\Administrator\\Desktop\\Form.pdf");

    //Get the form from the document
    intrusive_ptr<PdfFormWidget> form = Object::Convert<PdfFormWidget>(doc->GetForm());

    //Get the form widget collection
    intrusive_ptr<PdfFormFieldWidgetCollection> formWidgetCollection = form->GetFieldsWidget();

    //Loop through the widgets
    for (int i = 0; i < formWidgetCollection->GetCount(); i++)
    {
        //Get a specific field
        intrusive_ptr<PdfField> field = formWidgetCollection->GetItem(i);

        //Determine if the field is a text box
        wchar_t nm_w1[100];
        swprintf(nm_w1, 100, L"%hs", typeid(PdfTextBoxFieldWidget).name());
        LPCWSTR_S newName1 = nm_w1;
        if (wcscmp(newName1, field->GetInstanceTypeName()) == 0)
        {
            intrusive_ptr<PdfTextBoxFieldWidget> textBoxField = Object::Convert<PdfTextBoxFieldWidget>(field);
            wstring str = textBoxField->GetName();
            if (str == L"name")
            {
                //Set the text of text box
                textBoxField->SetText(L"Kaila Smith");
            }
        }

        //Determine if the field is a check box
        wchar_t nm_w2[100];
        swprintf(nm_w2, 100, L"%hs", typeid(PdfCheckBoxWidgetFieldWidget).name());
        LPCWSTR_S newName2 = nm_w2;
        if (wcscmp(newName2, field->GetInstanceTypeName()) == 0)
        {
            intrusive_ptr<PdfCheckBoxWidgetFieldWidget> checkBoxField = Object::Convert<PdfCheckBoxWidgetFieldWidget>(field);
            wstring str = checkBoxField->GetName();
            if (str == L"travel")
            {
                //Set the "Checked" status of check box
                checkBoxField->SetChecked(true);
            }
            else if (str == L"movie")
            {
                checkBoxField->SetChecked(true);
            }
        }

        //Determine if the field is a combo box
        wchar_t nm_w3[100];
        swprintf(nm_w3, 100, L"%hs", typeid(PdfListBoxWidgetFieldWidget).name());
        LPCWSTR_S newName3 = nm_w3;
        if (wcscmp(newName3, field->GetInstanceTypeName()) == 0)
        {
            intrusive_ptr<PdfListBoxWidgetFieldWidget> listBoxField = Object::Convert<PdfListBoxWidgetFieldWidget>(field);
            wstring str = listBoxField->GetName();
            if (str == L"country")
            {
                //Set the selected index of combo box
                vector<int> item = { 0 };
                listBoxField->SetSelectedIndex(item);
            }
        }

        //Determine if the field is a radio button
        wchar_t nm_w4[100];
        swprintf(nm_w4, 100, L"%hs", typeid(PdfRadioButtonListFieldWidget).name());
        LPCWSTR_S newName4 = nm_w4;
        if (wcscmp(newName4, field->GetInstanceTypeName()) == 0)
        {
            intrusive_ptr<PdfRadioButtonListFieldWidget> radioButtonListField = Object::Convert<PdfRadioButtonListFieldWidget>(field);
            wstring str = radioButtonListField->GetName();
            if (str == L"gender")
            {
                //Set the selected index of radio button
                radioButtonListField->SetSelectedIndex(1);
            }
        }

        //Determine if the field is a list box
        wchar_t nm_w5[100];
        swprintf(nm_w5, 100, L"%hs", typeid(PdfComboBoxWidgetFieldWidget).name());
        LPCWSTR_S newName5 = nm_w5;
        if (wcscmp(newName5, field->GetInstanceTypeName()) == 0)
        {
            intrusive_ptr<PdfComboBoxWidgetFieldWidget> comBoxField = Object::Convert<PdfComboBoxWidgetFieldWidget>(field);
            wstring str = comBoxField->GetName();
            if (str == L"degree")
            {
                //Set the selected index of list box
                vector<int> item = { 1 };
                comBoxField->SetSelectedIndex(item);
            }
        }
    }

    //Save to file
    doc->SaveToFile(L"Output/FillFormFields.pdf", FileFormat::PDF);
    doc->Close();
    delete doc;
}

C++: Create, Fill or Remove Form Fields in PDF

Remove Form Fields from PDF in C++

A form field in a PDF document can be accessed by its index or name and removed by PdfFieldCollection->Remove() method. The following are the steps to remove a particular field or all fields from a PDF document using Sprie.PDF for C++.

  • Create a PdfDocument object.
  • Load a sample PDF document using PdfDocument->LoadFromFile() method.
  • Get the form from the document using PdfDocument->GetForm() method.
  • Get the form field widget collection using PdfFormWidget->GetFieldsWidget() method.
  • Get a specific field using PdfFormFieldWidgetCollection->GetItem() method, and remove it using PdfFieldCollection->Remove() method.
  • To remove all fields at once, use PdfFieldCollection->Clear() method.
  • Save the document to a PDF file using PdfDocument->SaveToFile() method.
  • C++
#include "Spire.Pdf.o.h";

using namespace Spire::Pdf;
using namespace std;

int main() {

    //Create a PdfDocument object
    PdfDocument* doc = new PdfDocument();

    //Load a PDF file
    doc->LoadFromFile(L"C:\\Users\\Administrator\\Desktop\\Form.pdf");

    //Get the form from the document
    intrusive_ptr<PdfFormWidget> form = Object::Convert<PdfFormWidget>(doc->GetForm());

    //Get form widgets from the form
    intrusive_ptr<PdfFormFieldWidgetCollection> widgets = form->GetFieldsWidget();

    //Get a specific field by its name
    intrusive_ptr<PdfField> field = widgets->GetItem(L"name");

    //Remove the field
    widgets->Remove(field);

    //Remove all fields
    //widgets->Clear();

    //Save to file
    doc->SaveToFile(L"Output/DeleteFields.pdf", FileFormat::PDF);
    doc->Close();
    delete doc;
}

C++: Create, Fill or Remove Form Fields in 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.

C++: Convert Excel to XPS

2023-04-11 01:01:37 Written by Administrator

XPS stands for XML Paper Specification, which is a fixed layout file format developed by Microsoft. Unlike some formats that allow for dynamic content and layout changes, XPS is built to preserve the layout of documents and maintain their visual appearance across different devices. XPS files can be easily viewed using the Microsoft XPS Viewer, which is pre-installed on many Windows computers.

There are several benefits to converting Excel files to XPS format. Firstly, it provides an efficient way to share Excel data with others who lack access to Microsoft Excel or other spreadsheet software. Secondly, it ensures that the formatting of the original Excel file remains intact, making it easy to read and understand. Another advantage of converting Excel to XPS is accessibility: XPS files are built to be accessible, meaning they can be read by screen readers and assistive technology. In this article, we will explain how to convert an Excel file to XPS format in C++ using Spire.XLS for C++.

Install Spire.XLS for C++

There are two ways to integrate Spire.XLS 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.XLS for C++ in a C++ Application

Convert Excel to XPS in C++

Converting an Excel file to XPS format is very straightforward using Spire.XLS for C++. You just need to load the Excel file using the Workbook->LoadFromFile(LPCWSTR_S fileName) method and then call the Workbook->SaveToFile(LPCWSTR_S fileName, FileFormat::XPS) method to save it as XPS. The detailed steps are as follows:

  • Specify the input and output file paths.
  • Initialize an instance of the Workbook class.
  • Load the Excel file specified by the input file path using Workbook->LoadFromFile() method.
  • Save the Excel file to an XPS file with the specified file path using Workbook->SaveToFile(LPCWSTR_S fileName, FileFormat::XPS) method.
  • C++
#include "Spire.Xls.o.h" 

using namespace Spire::Xls;
using namespace std;

int main()
{
	//Specify the input and output file paths
	wstring inputFile = L"Sample.xlsx";
	wstring outputFile = L"ExcelToXPS.xps";

	//Initialize an instance of the Workbook class
	intrusive_ptr<Workbook> workbook = new Workbook();

	//Load the Excel file specified by the input file path
	workbook->LoadFromFile(inputFile.c_str());

	//Save the Excel file to an XPS file with the specified file path
	workbook->SaveToFile(outputFile.c_str(), Spire::Xls::FileFormat::XPS);
	workbook->Dispose();
}

C++: Convert Excel to XPS

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 bookmark in a Word document enables you to navigate to any specific place within the document without having to scroll through large blocks of text. It functions just like an internal link between sections of your document. Bookmarks are particularly useful for navigating through lengthy documents. In this article, you will learn how to add or remove bookmarks in Word documents in C++ using Spire.Doc for C++.

Install Spire.Doc for C++

There are two ways to integrate Spire.Doc 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.Doc for C++ in a C++ Application

Add a Bookmark to a Paragraph in C++

Bookmarks are usually created based on whole paragraphs, especially when the paragraphs themselves are headings. The following are the steps to add a bookmark to a paragraph using Spire.Doc for C++.

  • Create a Document object.
  • Load a Word file using Document->LoadFromFile() method.
  • Get a specific section using Document->GetSections()->GetItem() method.
  • Get a specific paragraph from the section using Section->GetParagraphs()->GetItem() method.
  • Create a BookmarkStart object, and insert it at the beginning of the paragraph using Paragraph->GetChildObjects()->Insert(int index, Spire::Doc::IDocumentObject *entity) method.
  • Append a BookmarkEnd object at the end of the paragraph using Paragraph->AppendBookmarkEnd(LPCWSTR_S name) method.
  • Save the document to another Word file using Document->SaveToFile() method.
  • C++
#include "Spire.Doc.o.h";

using namespace Spire::Doc;

int main() {

 //Create a Document object
 intrusive_ptr<Document> document = new Document();

 //Load a Word file
 document->LoadFromFile(L"C:\\Users\\Administrator\\Desktop\\sample2.docx");

 //Get a specific paragraph
 intrusive_ptr<Paragraph> paragraph = document->GetSections()->GetItemInSectionCollection(0)->GetParagraphs()->GetItemInParagraphCollection(1);

 //Create a bookmark start
 intrusive_ptr<BookmarkStart> start = new BookmarkStart(document, L"myBookmark");

 //Insert the bookmark start before the selected text
 paragraph->GetChildObjects()->Insert(0, start);

 //Append a bookmark end at the end of the paragraph
 paragraph->AppendBookmarkEnd(L"myBookmark");

 //Save the document to another Word file
 document->SaveToFile(L"Output/AddBookmarkToParagraph.docx", FileFormat::Docx2013);
 document->Close();
}

C++: Add or Remove Bookmarks in Word Documents

Add a Bookmark to Selected Text in C++

A bookmark can also be inserted to a specific position within a paragraph. The following are the steps to add a bookmark to selected text using Spire.Doc for C++.

  • Create a Document object.
  • Load a Word file using Document->LoadFromFile() method.
  • Find the selected text from the document using Document->FindAllString() method.
  • Find the owner paragraph of the text using TextSelection-> ->GetAsOneRange()->GetOwnerParagraph() method.
  • Get the index of the text in the paragraph using Paragraph->GetChildObjects()->IndexOf() method.
  • Create a BookmarkStart object, and insert it before the selected text using Paragraph->GetChildObjects()->Insert(int index, Spire::Doc::IDocumentObject *entity) method.
  • Create a BookmarkEnd object, and insert it after the selected text using Paragraph->GetChildObjects()->Insert(int index, Spire::Doc::IDocumentObject *entity) method.
  • Save the document to another Word file using Document->SaveToFile() method.
  • C++
#include "Spire.Doc.o.h";

using namespace Spire::Doc;
using namespace std;

int main() {

    //Create a Document object
    intrusive_ptr<Document> document = new Document();

    //Load a Word file
    document->LoadFromFile(L"C:\\Users\\Administrator\\Desktop\\sample2.docx");

    //Specify text to find
    wstring stringToFind = L"business-to-consumer";

    //Find the text from the document
    vector<intrusive_ptr<TextSelection>>  finds = document->FindAllString(stringToFind.c_str(), false, true);
    intrusive_ptr<TextSelection> specificText = finds[0];

    //Find the paragraph where the text is located
    intrusive_ptr<Paragraph> para = specificText->GetAsOneRange()->GetOwnerParagraph();

    //Get the index of the text in the paragraph
    int index = para->GetChildObjects()->IndexOf(specificText->GetAsOneRange());

    //Create a bookmark start
    intrusive_ptr<BookmarkStart> start = new BookmarkStart(document, L"myBookmark");

    //Insert the bookmark start before the selected text
    para->GetChildObjects()->Insert(index, start);

    //Create a bookmark end
    intrusive_ptr<BookmarkEnd> end = new BookmarkEnd(document, L"myBookmark");

    //Insert the bookmark end after the selected text
    para->GetChildObjects()->Insert(index + 2, end);

    //Save the document to another Word file
    document->SaveToFile(L"Output/AddBookmarkToText.docx", FileFormat::Docx2013);
    document->Close();
}

C++: Add or Remove Bookmarks in Word Documents

Remove Bookmarks from a Word Document in C++

Using Spire.Doc for C++, you can easily get and remove all bookmarks or a particular bookmark from a Word document. The following are the detailed steps.

  • Create a Document object.
  • Load a Word file containing bookmarks using Document->LoadFromFile() method.
  • Get a specific bookmark using Document->GetBookmarks()->GetItem() method.
  • Remove the bookmark using Document->GetBookmarks()->Remove() method. To remove all bookmarks at once, use Document->GetBookmarks()->Clear() method.
  • Save the document to another Word file using Document->SaveToFile() method.
  • C++
#include "Spire.Doc.o.h";

using namespace Spire::Doc;

int main() {

 //Create a Document object
 intrusive_ptr<Document> document = new Document();

 //Load a Word file
 document->LoadFromFile(L"C:\\Users\\Administrator\\Desktop\\Bookmarks.docx");

 //Get a specific bookmark by its index
 intrusive_ptr<Bookmark> bookmark = document->GetBookmarks()->GetItem(0);

 //Remove the bookmark
 document->GetBookmarks()->Remove(bookmark);

 //Remove all bookmarks
 //document->GetBookmarks()->Clear();

 //Save the document to another Word file
 document->SaveToFile(L"Output/RemoveBookmarks.docx", FileFormat::Docx2013);
 document->Close();
}

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.

page 92