support custom page sizes for document builder #147

page size custom is not supported for the document builder so a new overload which supports user defined page sizes is provided.
This commit is contained in:
Eliot Jones
2020-03-07 16:48:15 +00:00
parent ab3779e644
commit 24c5cbea4b
2 changed files with 66 additions and 10 deletions

View File

@@ -25,6 +25,34 @@
Assert.EndsWith("%%EOF", str);
}
[Fact]
public void CanCreateSingleCustomPageSize()
{
var builder = new PdfDocumentBuilder();
var page = builder.AddPage(120, 250);
var font = builder.AddStandard14Font(Standard14Font.Helvetica);
page.AddText("Small page.", 12, new PdfPoint(25, 200), font);
var bytes = builder.Build();
WriteFile(nameof(CanCreateSingleCustomPageSize), bytes);
using (var document = PdfDocument.Open(bytes, ParsingOptions.LenientParsingOff))
{
Assert.Equal(1, document.NumberOfPages);
var page1 = document.GetPage(1);
Assert.Equal(120, page1.Width);
Assert.Equal(250, page1.Height);
Assert.Equal("Small page.", page1.Text);
}
}
[Fact]
public void CanReadSingleBlankPage()
{

View File

@@ -33,7 +33,8 @@
public DocumentInformationBuilder DocumentInformation { get; } = new DocumentInformationBuilder();
/// <summary>
/// The current page builders in the document and the corresponding 1 indexed page numbers. Use <see cref="AddPage"/> to add a new page.
/// The current page builders in the document and the corresponding 1 indexed page numbers. Use <see cref="AddPage(double,double)"/>
/// or <see cref="AddPage(PageSize,bool)"/> to add a new page.
/// </summary>
public IReadOnlyDictionary<int, PdfPageBuilder> Pages => pages;
@@ -136,19 +137,19 @@
/// <summary>
/// Add a new page with the specified size, this page will be included in the output when <see cref="Build"/> is called.
/// </summary>
/// <param name="size">The size of the page to add.</param>
/// <param name="isPortrait">Whether the page is in portait or landscape orientation.</param>
/// <param name="width">The width of the page in points.</param>
/// <param name="height">The height of the page in points.</param>
/// <returns>A builder for editing the new page.</returns>
public PdfPageBuilder AddPage(PageSize size, bool isPortrait = true)
public PdfPageBuilder AddPage(double width, double height)
{
if (!size.TryGetPdfRectangle(out var rectangle))
if (width < 0)
{
throw new ArgumentException($"No rectangle found for Page Size {size}.");
throw new ArgumentOutOfRangeException(nameof(width), $"Width cannot be negative, got: {width}.");
}
if (!isPortrait)
if (height < 0)
{
rectangle = new PdfRectangle(0, 0, rectangle.Height, rectangle.Width);
throw new ArgumentOutOfRangeException(nameof(height), $"Height cannot be negative, got: {height}.");
}
PdfPageBuilder builder = null;
@@ -166,12 +167,39 @@
builder = new PdfPageBuilder(pages.Count + 1, this);
}
builder.PageSize = rectangle;
builder.PageSize = new PdfRectangle(0, 0, width, height);
pages[builder.PageNumber] = builder;
return builder;
}
/// <summary>
/// Add a new page with the specified size, this page will be included in the output when <see cref="Build"/> is called.
/// </summary>
/// <param name="size">The size of the page to add.</param>
/// <param name="isPortrait">Whether the page is in portait or landscape orientation.</param>
/// <returns>A builder for editing the new page.</returns>
public PdfPageBuilder AddPage(PageSize size, bool isPortrait = true)
{
if (size == PageSize.Custom)
{
throw new ArgumentException($"Cannot use ${nameof(PageSize.Custom)} for ${nameof(AddPage)} using the ${nameof(PageSize)} enum, call the overload with width and height instead.",
nameof(size));
}
if (!size.TryGetPdfRectangle(out var rectangle))
{
throw new ArgumentException($"No rectangle found for Page Size {size}.");
}
if (!isPortrait)
{
return AddPage(rectangle.Height, rectangle.Width);
}
return AddPage(rectangle.Width, rectangle.Height);
}
/// <summary>
/// Builds a PDF document from the current content of this builder and its pages.
/// </summary>