Skip to content

Commit

Permalink
Adds operations for adding/removing pages in a PDF
Browse files Browse the repository at this point in the history
  • Loading branch information
svengeance committed Jan 1, 2024
1 parent 941ab1a commit e694bf1
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 8 deletions.
73 changes: 73 additions & 0 deletions src/QPdfSharp/QPdf.Pages.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// Copyright © Stephen (Sven) Vernyi and Contributors. Licensed under the MIT License (MIT). See License.md in the repository root for more information.

using QPdfSharp.Extensions;
using QPdfSharp.Interop;

namespace QPdfSharp;

public unsafe partial class QPdf
{
public int GetPageCount()
{
var pageCount = QPdfInterop.qpdf_get_num_pages(_qPdfData);
CheckError();

return pageCount;
}

public QPdfPage GetPage(int pageNumber)
{
var pagePtr = QPdfInterop.qpdf_get_page_n(_qPdfData, (UIntPtr)pageNumber);
CheckError();

return new QPdfPage(_qPdfData, pagePtr);
}

public QPdfPage GetPageById(int id, int generation)
{
var pageIndex = QPdfInterop.qpdf_find_page_by_id(_qPdfData, id, generation);
CheckError();

return GetPage(pageIndex);
}

public void AppendPage(QPdfPage newPage)
{
QPdfInterop.qpdf_add_page(_qPdfData, newPage._qPdfData, newPage._qPdfPage, first: 0);
CheckError();
}

public void PrependPage(QPdfPage newPage)
{
QPdfInterop.qpdf_add_page(_qPdfData, newPage._qPdfData, newPage._qPdfPage, first: 1);
CheckError();
}

public void InsertPage(QPdfPage newPage, int insertAt, bool insertBefore = true)
{
var numPages = GetPageCount();
if (insertAt < 0 || insertAt > numPages)
throw new ArgumentOutOfRangeException(nameof(insertAt), $"Insert index must be between 0 and {numPages} inclusive.");

var refPage = GetPage(insertAt);
InsertPage(newPage, refPage, insertBefore);
}

public void InsertPage(QPdfPage newPage, QPdfPage targetPage, bool insertBefore = true)
{
QPdfInterop.qpdf_add_page_at(_qPdfData, newPage._qPdfData, newPage._qPdfPage, before: insertBefore.ToQPdfBool(), targetPage._qPdfPage);
CheckError();
}

public void RemovePage(int pageNumber)
{
var page = GetPage(pageNumber);
RemovePage(page);
}

public void RemovePage(QPdfPage page)
{
QPdfInterop.qpdf_remove_page(_qPdfData, page._qPdfPage);
CheckError();
}
}
8 changes: 0 additions & 8 deletions src/QPdfSharp/QPdf.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,6 @@ public QPdf(ReadOnlyMemory<byte> bytes, string name = "in-memory pdf", string pa
CheckError(QPdfInterop.qpdf_read_memory(_qPdfData, fileNameBytes, (sbyte*)fileBytesHandle.Pointer, (ulong)bytes.Length, passwordBytes));
}

public int GetPageCount()
{
var pageCount = QPdfInterop.qpdf_get_num_pages(_qPdfData);
CheckError();

return pageCount;
}

public void Dispose()
{
if (_outputStream is { IsDisposed: false })
Expand Down
18 changes: 18 additions & 0 deletions src/QPdfSharp/QPdfPage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright © Stephen (Sven) Vernyi and Contributors. Licensed under the MIT License (MIT). See License.md in the repository root for more information.

using QPdfSharp.Interop;

namespace QPdfSharp;

public readonly struct QPdfPage
{
internal readonly unsafe QPdfData* _qPdfData;

internal readonly uint _qPdfPage;

internal unsafe QPdfPage(QPdfData* qPdfData, uint qPdfPage)
{
_qPdfData = qPdfData;
_qPdfPage = qPdfPage;
}
}

0 comments on commit e694bf1

Please sign in to comment.