PDFsharp Sample: Combine Documents

Modified on 2015/09/14 10:23 by Thomas Hövel — Categorized as: PDFsharp Samples, Samples

<< Previous^UpNext >>
This sample shows how to create a new document from two existing PDF files. The pages are inserted alternately from two external documents. This may be useful for visual comparison.

Two different techniques are demonstrated:

PDF Output File

See the PDF files created by this sample (using two different methods):

output1.pdf (165 kB)

output2.pdf (42 kB)

Screen Shots

Here is a sample screen shot:

Variant1 screen shot Variant2 screen shot

Source Code

The sample shows two methods how existing PDF pages can be imported into a new document.

Variant1:

Imports pages from an external document. Note that this technique imports the whole page including the hyperlinks.
// Open the input files
PdfDocument inputDocument1 = PdfReader.Open(filename1, PdfDocumentOpenMode.Import);
PdfDocument inputDocument2 = PdfReader.Open(filename2, PdfDocumentOpenMode.Import);
 
// Create the output document
PdfDocument outputDocument = new PdfDocument();
 
// Show consecutive pages facing. Requires Acrobat 5 or higher.
outputDocument.PageLayout = PdfPageLayout.TwoColumnLeft;
 
XFont font = new XFont("Verdana", 10, XFontStyle.Bold);
XStringFormat format = new XStringFormat();
format.Alignment = XStringAlignment.Center;
format.LineAlignment = XLineAlignment.Far;
XGraphics gfx;
XRect box;
int count = Math.Max(inputDocument1.PageCount, inputDocument2.PageCount);
for (int idx = 0; idx < count; idx++)
{
  // Get page from 1st document
  PdfPage page1 = inputDocument1.PageCount > idx ?
    inputDocument1.Pages[idx] : new PdfPage();
 
  // Get page from 2nd document
  PdfPage page2 = inputDocument2.PageCount > idx ?
    inputDocument2.Pages[idx] : new PdfPage();
 
  // Add both pages to the output document
  page1 = outputDocument.AddPage(page1);
  page2 = outputDocument.AddPage(page2);
 
  // Write document file name and page number on each page
  gfx = XGraphics.FromPdfPage(page1);
  box = page1.MediaBox.ToXRect();
  box.Inflate(0, -10);
  gfx.DrawString(String.Format("{0} • {1}", filename1, idx + 1),
    font, XBrushes.Red, box, format);
 
  gfx = XGraphics.FromPdfPage(page2);
  box = page2.MediaBox.ToXRect();
  box.Inflate(0, -10);
  gfx.DrawString(String.Format("{0} • {1}", filename2, idx + 1),
    font, XBrushes.Red, box, format);
}
 
// Save the document...
const string filename = "CompareDocument1_tempfile.pdf";
outputDocument.Save(filename);

Variant2:

Imports the pages as form X objects. Note that this technique copies only the visual content and the hyperlinks do not work.
// Create the output document
PdfDocument outputDocument = new PdfDocument();
 
// Show consecutive pages facing
outputDocument.PageLayout = PdfPageLayout.TwoPageLeft;
 
XFont font = new XFont("Verdana", 10, XFontStyle.Bold);
XStringFormat format = new XStringFormat();
format.Alignment = XStringAlignment.Center;
format.LineAlignment = XLineAlignment.Far;
XGraphics gfx;
XRect box;
 
// Open the external documents as XPdfForm objects. Such objects are
// treated like images. By default the first page of the document is
// referenced by a new XPdfForm.
XPdfForm form1 = XPdfForm.FromFile(filename1);
XPdfForm form2 = XPdfForm.FromFile(filename2);
 
int count = Math.Max(form1.PageCount, form2.PageCount);
for (int idx = 0; idx < count; idx++)
{
  // Add two new pages to the output document
  PdfPage page1 = outputDocument.AddPage();
  PdfPage page2 = outputDocument.AddPage();
 
  if (form1.PageCount > idx)
  {
    // Get a graphics object for page1
    gfx = XGraphics.FromPdfPage(page1);
 
    // Set page number (which is one-based)
    form1.PageNumber = idx + 1;
 
    // Draw the page identified by the page number like an image
    gfx.DrawImage(form1, new XRect(0, 0, form1.PointWidth, form1.PointHeight));
 
    // Write document file name and page number on each page
    box = page1.MediaBox.ToXRect();
    box.Inflate(0, -10);
    gfx.DrawString(String.Format("{0} • {1}", filename1, idx + 1),
      font, XBrushes.Red, box, format);
  }
 
  // Same as above for second page
  if (form2.PageCount > idx)
  {
    gfx = XGraphics.FromPdfPage(page2);
 
    form2.PageNumber = idx + 1;
    gfx.DrawImage(form2, new XRect(0, 0, form2.PointWidth, form2.PointHeight));
 
    box = page2.MediaBox.ToXRect();
    box.Inflate(0, -10);
    gfx.DrawString(String.Format("{0} • {1}", filename2, idx + 1),
      font, XBrushes.Red, box, format);
  }
}
 
// Save the document...
const string filename = "CompareDocument2_tempfile.pdf";
outputDocument.Save(filename);

Note: The samples on this site usually show and discuss code snippets only. The complete source code of the samples with solutions for Visual Studio is available from the download area on CodePlex.