From e694bf1295b1c24de4ff7eaf5dc7f960c0d0aea6 Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 1 Jan 2024 02:22:25 -0600 Subject: [PATCH] Adds operations for adding/removing pages in a PDF --- src/QPdfSharp/QPdf.Pages.cs | 73 +++++++++++++++++++++++++++++++++++++ src/QPdfSharp/QPdf.cs | 8 ---- src/QPdfSharp/QPdfPage.cs | 18 +++++++++ 3 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 src/QPdfSharp/QPdf.Pages.cs create mode 100644 src/QPdfSharp/QPdfPage.cs diff --git a/src/QPdfSharp/QPdf.Pages.cs b/src/QPdfSharp/QPdf.Pages.cs new file mode 100644 index 0000000..0e9aa11 --- /dev/null +++ b/src/QPdfSharp/QPdf.Pages.cs @@ -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(); + } +} diff --git a/src/QPdfSharp/QPdf.cs b/src/QPdfSharp/QPdf.cs index 078ea68..2dea41d 100644 --- a/src/QPdfSharp/QPdf.cs +++ b/src/QPdfSharp/QPdf.cs @@ -34,14 +34,6 @@ public QPdf(ReadOnlyMemory 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 }) diff --git a/src/QPdfSharp/QPdfPage.cs b/src/QPdfSharp/QPdfPage.cs new file mode 100644 index 0000000..8782712 --- /dev/null +++ b/src/QPdfSharp/QPdfPage.cs @@ -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; + } +}