PDFsharp Sample: Combine Documents

Modified on 2009/08/11 12:09 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);