【问题标题】:How to reorder a pdf document with iText 7如何使用 iText 7 重新排序 pdf 文档
【发布时间】:2017-10-22 02:05:54
【问题描述】:

我正在学习 iText 7 库,我希望它具有两个主要功能:重新排序页面和旋转页面。后者在快速入门指南中很容易理解。前者我遇到了一些麻烦,因为我能找到的所有示例都是旧的或用于 java 的(或两者兼有)。

我目前只是尝试设置一个将第一页移到第二页之后的示例:

PdfReader reader = new PdfReader(FILE_READ_LOCATION);
PdfWriter writer = new PdfWriter(FILE_WRITE_LOCATION);
PdfDocument document = new PdfDocument(reader, writer);

PdfPage pageToMove = document.GetPage(1);

document.AddPage(3, pageToMove);
document.RemovePage(pageToMove);

document.Close();

出于某种原因,document.Close(); 抛出了 NullReferenceException(但我没有看到任何 null)。有什么建议吗?

这是我为 copyToCopyPagesTo 方法尝试的内容(dest.Close(); 抛出异常说 Document has no pages):

PdfReader reader = new PdfReader(FILE_READ_LOCATION);
PdfWriter writer = new PdfWriter(FILE_WRITE_LOCATION);

PdfDocument src = new PdfDocument(reader);
PdfDocument dest = new PdfDocument(writer);

src.GetPage(1).CopyTo(dest);
src.CopyPagesTo(new List<int>(1), dest);

src.Close();
dest.Close();

【问题讨论】:

  • new List&lt;int&gt;(1) 创建一个 容量为 1空列表。你可能想做new List&lt;int&gt; { 1 }(带花括号),它创建一个包含一个条目的列表,1
  • @mkl 哦,这是我的愚蠢举动。这似乎行得通。现在对src.GetPage(1).CopyTo(dest); 有什么建议吗?
  • src.GetPage(1).CopyTo(dest) 将页面 data 从源复制到目标,它只是尚未将其添加到目标页面树。这就是为什么CopyTo 返回一个可以与dest.AddPage(...) 一起使用的页面对象的原因;这允许您在所需的任何位置插入页面。
  • @mkl 很有趣。所以我想这将是正确的方法:dest.AddPage(src.GetPage(1).CopyTo(dest));

标签: c# pdf itext itext7


【解决方案1】:

正如@Bruno 指出的那样,使用PdfDocument 方法CopyPagesTo 的重载可以轻松地使用iText 7 重新排序pdf 文档。

关于你的尝试

  • src.GetPage(1).CopyTo(dest);

    CopyTo(dest) 将页面数据从源复制到目标,它只是将其添加到目标页面树 .这就是为什么CopyTo 返回一个页面对象,您可以将其与dest.AddPage(...) 重载一起使用;这尤其允许您在所需的任何位置插入页面。

  • src.CopyPagesTo(new List&lt;int&gt;(1), dest);

    new List&lt;int&gt;(1) 创建一个空列表容量为 1。你可能想做new List&lt;int&gt; { 1 }(带花括号),它创建一个包含一个条目的列表,1

【讨论】:

    【解决方案2】:

    您应该阅读常见问题解答条目How to reorder pages in an existing PDF file?

    首先你需要创建一个List 的整数。例如:

    List<int> pages = new List<int>();
    pages.Add(2);
    pages.Add(1);
    for (int i = 3; i <= total; i++) {
        pages.Add(i);
    }
    

    然后您可以使用此页面序列将一个 PDF 的页面复制到另一个 PDF:

    srcDoc.CopyPagesTo(pages, resultDoc);
    

    其中srcDoc 是使用PdfReader 对象创建的PdfDocumentresultDoc 是使用PdfWriter 对象创建的PdfDocument

    【讨论】:

    • 这是java的一个例子。此外,PdfDocument.CopyPagesToPdfPage.CopyTo 方法在 C# 中似乎没有任何作用(除非我使用错误)。使用这些后,“resultDoc”仍然有 0 页
    • 此解决方案似乎删除了文档级元数据(除非手动复制它们),而使用 PdfReader.selectPagesPdfStamper 的 iText 5 版本自动保留它们。难道不应该有一个解决方案来保存所有文档级别的数据吗?
    • @derekantrican "(除非我用错了)" - 让我们检查你是否应该展示你是如何使用它们的。特别是,您的源文档和目标文档是否不同?
    • @mkl 我尝试将 source 和 dest 作为相同的 PdfDocument 以及不同的文档。在这两种情况下,我都没有弄清楚如何成功使用CopyPagesToCopyTo 方法
    • @derekantrican “我已经尝试将 source 和 dest 设置为相同的 PdfDocument - 这不太可能奏效。 “也可以作为不同的文件” - 这应该可以。请分享您的代码以允许重现该问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2018-05-10
    • 2014-03-24
    • 2014-09-19
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多