SplitA3toA4x2.cs
C# VB
//// This code is part of Document Solutions for PDF .NET demos.// Copyright (c) MESCIUS inc. All rights reserved.//using System.IO;using System.Drawing;using GrapeCity.Documents.Pdf;using GrapeCity.Documents.Pdf.Graphics;using GCTEXT = GrapeCity.Documents.Text;using GCDRAW = GrapeCity.Documents.Drawing;
namespace DsPdfWeb.Demos{ // This sample shows how to convert a PDF with A3 landscape oriented pages to a PDF // in which each source PDF's A3 landscape page is split into two A4 portrait pages. // // For each of the source PDF's A3 landscape pages we create a FormXObject representing it, // add two A4 portrait pages to the target document, and then render the FormXObject // onto each of the A4 pages' graphics with left and right alignment and no scaling. // Effectively, this renders the left half of the source A3 page on the first A4 page, // and the right half of it on the second A4 page. public class SplitA3toA4x2 { public int CreatePDF(Stream stream) { // A3 and A4 page sizes: // A3 is 11.69" � 16.54": var sizeA3 = new SizeF(11.69f * 72, 16.54f * 72); // A4 is 8.27" x 11.60": var sizeA4 = new SizeF(8.27f * 72, 11.60f * 72);
// Create a sample source PDF with A3 landscape oriented pages: var docA3 = new GcPdfDocument() { PageSize = sizeA3, Landscape = true, }; // First page is a horizontal image filling the whole page: var p0 = docA3.Pages.Add(); var imgA3 = GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "aurora.jpg")); p0.Graphics.DrawImage(imgA3, new RectangleF(PointF.Empty, docA3.PageSize), null, GCDRAW.ImageAlign.StretchImage);
// Add a few more A3 pages as two columns of random 'lorem ipsum' text: var p1 = docA3.Pages.Add(); var g = p1.Graphics; var tl = g.CreateTextLayout(); tl.DefaultFormat.Font = StandardFonts.Times; tl.DefaultFormat.FontSize = 12; tl.TextAlignment = GCTEXT.TextAlignment.Justified; tl.FirstLineIndent = 72 / 2; tl.ParagraphSpacing = 72 / 8; // Add random text: tl.Append(Common.Util.LoremIpsum(37)); // Specify 1/4" margins all around: const float margin = 72 / 4; tl.MarginAll = margin; var colWidth = p1.Size.Width / 2; tl.MaxWidth = colWidth; tl.MaxHeight = p1.Size.Height; tl.PerformLayout(true); // In a loop, split and render the text in a 2 column layout, adding pages as needed: int col = 0; while (true) { // 'rest' will accept the text that did not fit: var splitResult = tl.Split(null, out GCTEXT.TextLayout rest); g.DrawTextLayout(tl, new PointF(col * colWidth, 0)); if (splitResult != GCTEXT.SplitResult.Split) break; tl = rest; if (++col == 2) { docA3.Pages.Add(); g = docA3.Pages.Last.Graphics; col = 0; } } // At this point, 'docA3' is a PDF with landscape oriented A3 pages, // the first page contains an image filling the whole page, // other pages contain random text in two vertical column layout. // // The document may be saved for reference if needed: // docA3.Save("docA3.pdf");
// Create the resulting (target) PDF with A4 page size: var doc = new GcPdfDocument() { PageSize = sizeA4, Landscape = false, };
// FormXObjects are rendered on graphics like images, but without losing fidelity. // We create two image alignments for the left and the right halves of the source A3 page: var iaLeft = new GCDRAW.ImageAlign(GCDRAW.ImageAlignHorz.Left, GCDRAW.ImageAlignVert.Top, false, false, true, false, false); var iaRight = new GCDRAW.ImageAlign(GCDRAW.ImageAlignHorz.Right, GCDRAW.ImageAlignVert.Top, false, false, true, false, false); foreach (var pA3 in docA3.Pages) { // Create FormXObject representing the source page: var fxoA3 = new FormXObject(doc, pA3); // Draw its left and right halves on separate pages of the target PDF: var pLeft = doc.Pages.Add(); pLeft.Graphics.DrawForm(fxoA3, pLeft.Bounds, pLeft.Bounds, iaLeft); var pRight = doc.Pages.Add(); pRight.Graphics.DrawForm(fxoA3, pLeft.Bounds, pLeft.Bounds, iaRight); }
// Done: doc.Save(stream); return doc.Pages.Count; } }}