When a PDF document is dynamically created from an application, all the pages are kept in memory until the document is saved and destroyed. This can create a performance problem if the document that is created is very large and/or contains a large number of images.
A more efficient way to create large documents is to use the SavePage/ClearPage combination of calls to keep only one page in memory. The steps required to achieve this are the following:
Create a blank document.
Call StartSave (FileName, acFileSaveView) to create the file on the storage device.
Insert objects into the first page, example text, images and graphics.
Once the first page is constructed, call SavePage to save the current page.
Call ClearPage to remove the page contents from memory.
If the document contains bookmarks, call AddPage to add a new page to the document, otherwise construct the next page without adding a new page.
Repeat steps 3 to 6 for all the pages in the document.
Call EndSave to close the file.
Step 6 that consists of adding a new page is optional and is only needed if the bookmarks will be created after the document is finished. This step is needed so that the PDF Creator knows where to point the bookmarks to.
Only the acFileSaveView option of FileSaveOptionConstants in the StartSave method is supported.
Sub Sample()
' Constants for Activation codes
Const strLicenseTo As String = "Amyuni PDF Creator Evaluation"
Const strActivationCode As String = "07EFCDAB010001004282943F2AF19A88F332D9E781E40460727DF8A42847A1BDE06DB61C71E94E2D90424BF8762385335F9D6884E9FC"
' Initializing PDFCreativeX Object
Dim pdf As ACPDFCREACTIVEX.PDFCreactiveX = New ACPDFCREACTIVEX.PDFCreactiveX()
' Set license key
pdf.SetLicenseKey(strLicenseTo, strActivationCode)
' Save PDF using StartSave, SavePage and EndSave
pdf.StartSave("c:\temp\CreatePDFDocument_resulting.pdf", ACPDFCREACTIVEX.FileSaveOptionConstants.acFileSaveView)
' Create object in each Page
For page = 1 To 60
' Set the current page only if we are adding new pages
pdf.CurrentPage = page
' Create a Text in the current Page
pdf.CreateObject(ACPDFCREACTIVEX.ObjectTypeConstants.acObjectTypeText, "Text" + page.ToString)
Dim oText As ACPDFCREACTIVEX.IacObject = pdf.GetObjectByName("Text" + page.ToString)
oText("Left") = 1000
oText("Right") = 5000
oText("Top") = 0
oText("Bottom") = 4000
oText("BorderColor") = &HFF00FF
oText("BorderWidth") = ACPDFCREACTIVEX.acBorderWidth.acBorderWidthDouble
oText("Text") = "Amyuni Technologies " + page.ToString
' insert a bookmark that points to this page
pdf.RootBookmark.InsertChild(page, "Page " + page.ToString, "Text" + page.ToString, Nothing)
' Save page
pdf.SavePage(page)
' clear the page contents to save memory
pdf.ClearPage(page)
' Add page, because we are adding BookMarks. Otherwise, it is not necessary
pdf.AddPage(page)
Next
pdf.EndSave()
' destroy objects
pdf = Nothing
End Sub
static void Sample()
{
// Constants for Activation codes
const string strLicenseTo = "Amyuni PDF Creator Evaluation";
const string strActivationCode = "07EFCDAB010001004282943F2AF19A88F332D9E781E40460727DF8A42847A1BDE06DB61C71E94E2D90424BF8762385335F9D6884E9FC";
// Initializing PDFCreativeX Object
ACPDFCREACTIVEX.PDFCreactiveX pdf = new ACPDFCREACTIVEX.PDFCreactiveX();
// Set license key
pdf.SetLicenseKey(strLicenseTo, strActivationCode);
// Save PDF using StartSave, SavePage and EndSave
pdf.StartSave(@"c:\temp\CreatePDFDocument_resulting.pdf", ACPDFCREACTIVEX.FileSaveOptionConstants.acFileSaveView);
// Create object in each Page
for (int page = 1; page < 61; page++)
{
// Set the current page only if we are adding new pages
pdf.CurrentPage = page;
// Create a Text in the current Page
pdf.CreateObject(ACPDFCREACTIVEX.ObjectTypeConstants.acObjectTypeText, "Text" + page.ToString());
ACPDFCREACTIVEX.IacObject oText = pdf.GetObjectByName("Text" + page.ToString());
oText["Left"] = 1000;
oText["Right"] = 5000;
oText["Top"] = 0;
oText["Bottom"] = 4000;
oText["BorderColor"] = 0xFF00FF;
oText["BorderWidth"] = ACPDFCREACTIVEX.acBorderWidth.acBorderWidthDouble;
oText["Text"] = "Amyuni Technologies " + page.ToString();
// insert a bookmark that points to this page
ACPDFCREACTIVEX.acBookmark bookmark;
pdf.RootBookmark.InsertChild(page, "Page " + page.ToString(), "Text" + page.ToString(), out bookmark);
// Save page
pdf.SavePage(page);
// clear the page contents to save memory
pdf.ClearPage(page);
// Add page, because we are adding BookMarks. Otherwise, it is not necessary
pdf.AddPage(page);
}
pdf.EndSave();
// destroy objects
pdf = null;
}
#import "c:\users\amyuni\pdfcreactivex.dll" no_namespace
using namespace std;
int main()
{
// Constants for Activation codes
bstr_t strLicenseTo = "Amyuni PDF Creator Evaluation";
bstr_t strActivationCode = "07EFCDAB010001004282943F2AF19A88F332D9E781E40460727DF8A42847A1BDE06DB61C71E94E2D90424BF8762385335F9D6884E9FC";
// Initialize the COM subsystem
CoInitialize(0);
// IPDFCreactiveXPtr is a smart pointer type defined in pdfcreactivex.tlh,
// the type library header file generated by the #import instruction above
IPDFCreactiveXPtr pdf;
// Create the PDFCreactiveX instance
pdf.CreateInstance(__uuidof(PDFCreactiveX));
// set license key
pdf->SetLicenseKey(_bstr_t(strLicenseTo), _bstr_t(strActivationCode));
// ' Save PDF using StartSave, SavePage and EndSave
pdf->StartSave("c:\\temp\\CreatePDFDocument_resulting.pdf", FileSaveOptionConstants::acFileSaveView);
// Create object in each Page
for (int page = 1; page < 60; page++)
{
// Set the current page only if we are adding new pages
pdf->CurrentPage = page;
// Set-up variables for attributes
_variant_t varAttribute;
varAttribute.vt = VT_I4; // integers
// Create a text in the current Page
pdf->CreateObject(acObjectTypeText, "Text" + bstr_t(page));
IacObjectPtr oText = pdf->GetObjectByName("Text" + bstr_t(page));
oText->Attribute["Left"] = 1000;
oText->Attribute["Right"] = 5000;
oText->Attribute["Top"] = 0;
oText->Attribute["Bottom"] = 4000;
varAttribute.lVal = 0xFF00FF;
oText->Attribute["BorderColor"] = varAttribute;
varAttribute.lVal = acBorderWidthDouble;
oText->Attribute["BorderWidth"] = varAttribute;
oText->Attribute["Text"] = "Amyuni Technologies" + bstr_t(page);
// insert a bookmark that points to this page
IacBookmarkPtr bookmark;
pdf->RootBookmark->InsertChild(page, _bstr_t(page), "Text1", &bookmark);
// Save page
pdf->SavePage(page);
// clear the page contents to save memory
pdf->ClearPage(page);
// Add page, because we are adding BookMarks. Otherwise, it is not necessary
pdf->AddPage(page);
}
pdf->EndSave();
// destroy objects
pdf = NULL;
return 0;
}
' ObjectTypeConstants
Const acObjectTypeArrow = 36
Const acObjectTypeBarcode = 45
Const acObjectTypeCell = 33
Const acObjectTypeCheckBox = 21
Const acObjectTypeEllipse = 4
Const acObjectTypeExcel = 17
Const acObjectTypeField = 6
Const acObjectTypeGraph = 19
Const acObjectTypeHighlight = 23
Const acObjectTypeLine = 1
Const acObjectTypePicture = 7
Const acObjectTypePolygon = 8
Const acObjectTypeRoundFrame = 3
Const acObjectTypeRow = 32
Const acObjectTypeSelection = 24
Const acObjectTypeSignature = 39
Const acObjectTypeStickyNote = 22
Const acObjectTypeTable = 16
Const acObjectTypeText = 5
' acBorderWidth
Const acBorderWidthNone = 0
Const acBorderWidthSimple = 1
Const acBorderWidthDouble = 2
Const acBorderWidthTriple = 3
Const acBorderWidthQuadruple = 4
' FileSaveOptionConstants
Const acFileSaveAll = 0
Const acFileSaveDefault = -1
Const acFileSaveView = 1
Const acFileSaveDesign = 2
Const acFileSavePDFA_7 = 3
Const acFileSavePDFA = 4
Const acFileSavePDF14 = 5
' Constants for Activation codes
Const strLicenseTo = "Amyuni PDF Creator Evaluation"
Const strActivationCode = "07EFCDAB010001004282943F2AF19A88F332D9E781E40460727DF8A42847A1BDE06DB61C71E94E2D90424BF8762385335F9D6884E9FC"
' Initializing PDFCreativeX Object
Dim pdf
Set pdf = CreateObject("PDFCreactiveX.PDFCreactiveX.6.5")
' Set license key
pdf.SetLicenseKey strLicenseTo, strActivationCode
' Save PDF using StartSave, SavePage and EndSave
pdf.StartSave "c:\temp\CreatePDFDocument_resulting.pdf", acFileSaveView
' Create object in each Page
For page = 1 To 60
' Set the current page
pdf.CurrentPage = page
' Create a Text in the current Page
pdf.CreateObject acObjectTypeText, "Text" & page
Dim oText
Set oText = pdf.GetObjectByName("Text" & page)
oText("Left") = 1000
oText("Right") = 5000
oText("Top") = 0
oText("Bottom") = 4000
oText("BorderColor") = &HFF00FF
oText("BorderWidth") = acBorderWidthDouble
oText("Text") = "Amyuni Technologies" & page
' insert a bookmark that points to this page
pdf.RootBookmark.InsertChild page, "Page " & page, "Text" & page, Nothing
' Save page
pdf.SavePage page
' clear the page contents to save memory
pdf.ClearPage page
' Add page, because we are adding BookMarks. Otherwise, it is not necessary
pdf.AddPage page
Next
pdf.EndSave
' destroy Objects
Set pdf = Nothing
Set oText = Nothing