Debenu 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 Debenu 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");

// 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;

// 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;