Back to Blog

    Developer Blog

    Overlay one PDF onto another PDF programmatically

    Foxit Quick PDF Library

    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.