Creating Large PDF Document

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:

  1. Create a blank document.

  2. Call StartSave (FileName, acFileSaveView) to create the file on the storage device.

  3. Insert objects into the first page, example text, images and graphics.

  4. Once the first page is constructed, call SavePage to save the current page.

  5. Call ClearPage to remove the page contents from memory.

  6. 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.

  7. Repeat steps 3 to 6 for all the pages in the document.

  8. 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.

 

Example

Sub Sample()
    ' Constants for Activation codes
    Const strLicenseTo As String = "Amyuni PDF Creator Evaluation"
    Const strActivationCode As String = "07EFCDAB010001004282943FAAF19A88F332D9E781E40460727D78A42847A1BDE06DB61C71E94E2D90424BF8762385335F9D6884E9FC"
 
    ' 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 = "07EFCDAB010001004282943FAAF19A88F332D9E781E40460727D78A42847A1BDE06DB61C71E94E2D90424BF8762385335F9D6884E9FC";
 
    // 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 = "07EFCDAB010001004282943FAAF19A88F332D9E781E40460727D78A42847A1BDE06DB61C71E94E2D90424BF8762385335F9D6884E9FC";
 
    // 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 = "07EFCDAB010001004282943FAAF19A88F332D9E781E40460727D78A42847A1BDE06DB61C71E94E2D90424BF8762385335F9D6884E9FC"
 
' Initializing PDFCreativeX Object
Dim pdf
Set pdf = CreateObject("PDFCreactiveX.PDFCreactiveX.6.0")
 
' 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