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