Foxit Quick PDF Library

Overlay one PDF onto another PDF programmatically

Foxit Quick PDF Library makes it easy to copy a page from one PDF and draw that page onto one or more pages in a different PDF. This is very useful for when you have a template such as a letterhead that needs to be applied to all pages in a PDF before it is sent to a client. Whether the captured page is drawn overlay or underlay can be controlled by changing the content stream parts order using the MoveContentStream function.

In the C# sample code below we demonstrate how to overlay a letterhead template onto multiple pages in a PDF using Foxit Quick PDF Library. There’s also a Delphi sample code section below the C#.

/* Copy a page from one PDF and overlay it on all pages in a different PDF */

// Load the PDF that you want to apply the letterhead to (fileA)

DPL.LoadFromFile("Input.pdf", "");
int fileA = DPL.SelectedDocument();

// Load the letterhead template file (fileB)

DPL.LoadFromFile("Template.pdf", "");
int fileB = DPL.SelectedDocument();

// We'll now need to temporarily merge these two PDF files together

// Select fileA

DPL.SelectDocument(fileA);

// Merge fileA with fileB

DPL.MergeDocument(fileB);

// Count total number of pages in merged PDF

int pageCount = DPL.PageCount();

// Capture the last page in fileA which is 
// now the page with the letterhead from fileB
// Once a page has been captured it is automatically
// removed from the PDF

int CapturedPageID = DPL.CapturePage(pageCount);

// Set drawing origin co-ordinates to top left of page

DPL.SetOrigin(1);

// Iterate through each page in the PDF

for (int i = 1; i < pageCount; i++)
{
    // Select page 1 of fileA

    DPL.SelectPage(i);

    // Normalize page to make sure that the content
    // streams are in the state we want them to be

    DPL.NormalizePage(1);

    // Get page height and width

    double xPageHeight = DPL.PageHeight();
    double xPageWidth = DPL.PageWidth();

    // Create a new content stream that we can draw onto

    int contentstreamPos = DPL.NewContentStream();
    DPL.SelectContentStream(contentstreamPos);

    // Draw the captured template page onto the current page

    int ret = DPL.DrawCapturedPage(CapturedPageID, 0, 0, xPageWidth, xPageHeight);

    // Move the new content stream to the background
    // so that it does not cover the other content of the page

    int totalContentStreams = DPL.ContentStreamCount();
    int moveContentResult = DPL.MoveContentStream(contentstreamPos, 1); 
}

// Save the file

DPL.SaveToFile("Output.pdf");

Here is some sample code from Delphi, it’s slightly different but the core features are the same:

procedure TForm2.btnOverlayClick(Sender: TObject);
var
  FileA: Integer;
  FileB: Integer;
  CapturedPageID: Integer;
  PageHeight: Double;
  PageWidth: Double;
  Path: AnsiString;
begin
  DPL := TDebenuPDFLibrary1113.Create;
  try
    UnlockResult := DPL.UnlockKey('...'); // Insert trial or paid license key here
    if UnlockResult = 1 then
    begin
    // You can only use the DrawCapturedPage function if the captured page is in the same
    // document, so first we'll need to merge the two pages that we wish to overlay together
    // into one document.
    if dlgOpen.Execute then
      begin
         DPL.LoadFromFile(dlgOpen.FileName);
         FileA := DPL.SelectedDocument();
      end;
      if dlgOpen.Execute then
      begin
         DPL.LoadFromFile(dlgOpen.FileName);
         FileB := DPL.SelectedDocument();
      end;
      // After merging FileB is automatically deleted, leaving only FileB which is now a combination of FileA and FileB
      DPL.SelectDocument(FileA);
      DPL.MergeDocument(FileB);

      // Capture the second page in the merged document
      CapturedPageID := DPL.CapturePage(2);
      // Now select the first page and retrieve its height and width
      DPL.SelectDocument(FileA);
      DPL.SelectPage(1);
      PageHeight := DPL.PageHeight();
      PageWidth := DPL.PageWidth();
      // Draw the captured page onto the currently selected page
      DPL.DrawCapturedPage(CapturedPageID, 0, PageHeight, PageWidth, PageHeight);

      // Save the stitched file to disk
    if dlgSave.Execute then
      begin
        Path := dlgSave.FileName;
      end;
      DPL.SaveToFile(Path);
    end;
  finally
    DPL.Free;
  end;
end;

This article refers to a deprecated product. If you are looking for support for Foxit PDF SDK, please click here.

Updated on May 16, 2022

Was this article helpful?
Thanks for your feedback. If you have a comment on how to improve the article, you can write it here: