//
// This code is part of Document Solutions for PDF demos.
// Copyright (c) MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Numerics;
using System.Collections.Generic;
using System.Linq;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Annotations;
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;
}
}
}