// Create a single PDF file
void CreateOnePdfFile(string fileName, IEnumerable <CourseDesignator> courseDesignators)
{
List <CoursePage> pages = LayoutPages(courseDesignators);
PdfWriter pdfWriter = new PdfWriter(Path.GetFileNameWithoutExtension(fileName), coursePdfSettings.ColorModel == ColorModel.CMYK);
foreach (CoursePage page in pages)
{
CoursePage pageToDraw = page;
SizeF paperSize = new SizeF(pageToDraw.paperSize.Width / 100F, pageToDraw.paperSize.Height / 100F);
if (pageToDraw.landscape)
{
paperSize = new SizeF(paperSize.Height, paperSize.Width);
}
if (controller.UpdateProgressDialog(string.Format(MiscText.CreatingFile, Path.GetFileName(fileName)), (double)currentPage / (double)totalPages))
{
throw new Exception(MiscText.CancelledByUser);
}
IGraphicsTarget grTarget;
PdfImporter pdfImporter = null;
if (IsPdfMap)
{
// We need to re-obtain a PdfImporter every time, or else very strange bugs start to crop up.
pdfImporter = new PdfImporter(sourcePdfMapFileName);
float scaleRatio = CourseView.CreatePrintingCourseView(eventDB, page.courseDesignator).ScaleRatio;
if (scaleRatio == 1.0)
{
// If we're doing a PDF at scale 1, we just copy the page directly.
grTarget = pdfWriter.BeginCopiedPage(pdfImporter, 0);
pageToDraw = PdfNonScaledPage(page.courseDesignator);
}
else
{
Matrix transform = Geometry.CreateInvertedRectangleTransform(page.printRectangle, page.mapRectangle);
RectangleF printedPortionInMapCoords = Geometry.TransformRectangle(transform, new RectangleF(0, 0, paperSize.Width * 100F, paperSize.Height * 100F));
RectangleF printedPortionInInches = new RectangleF(
Geometry.InchesFromMm(printedPortionInMapCoords.Left),
Geometry.InchesFromMm(mapBounds.Height - printedPortionInMapCoords.Bottom),
Geometry.InchesFromMm(printedPortionInMapCoords.Width),
Geometry.InchesFromMm(printedPortionInMapCoords.Height));
grTarget = pdfWriter.BeginCopiedPartialPage(pdfImporter, 0, paperSize, printedPortionInInches);
}
// Don't draw the map normally.
mapDisplay.SetMapFile(MapType.None, null);
}
else
{
grTarget = pdfWriter.BeginPage(paperSize);
}
DrawPage(grTarget, pageToDraw);
pdfWriter.EndPage(grTarget);
grTarget.Dispose();
if (pdfImporter != null)
{
pdfImporter.Dispose();
pdfImporter = null;
}
currentPage += 1;
}
pdfWriter.Save(fileName);
}