java - 在 iTextSharp 中更改 PDF 文档的页面顺序

标签 java c# pdf itext

我正在尝试更改 PDF 文档的重新排序页面,但我不能,而且我也不知道为什么。

我读了几篇关于更改顺序的文章,它是java(iText),我对此遇到了一些问题。( exampl1exampl2example3 )。这个例子在c#上,但是有使用其他方法( exampl4 )

我想把我的目录放在 12 页上并放到 2 页上。 12页之后我还有其他内容。这是我用于更改页面顺序的模板:

String.Format("1,%s, 2-%s, %s-%s", toc, toc-1, toc+1, n)

这是我更改页面顺序的方法:

         public void ChangePageOrder(string path)
    {
        MemoryStream baos = new MemoryStream();

        PdfReader sourcePDFReader = new PdfReader(path);
        int toc = 12;
        int n = sourcePDFReader.NumberOfPages;
        sourcePDFReader.SelectPages(String.Format("1,%s, 2-%s, %s-%s", toc, toc-1, toc+1, n));

        using (var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))
            {
                PdfStamper stamper = new PdfStamper(sourcePDFReader, fs);
                stamper.Close();
            }
    }

这是对方法的调用:

  ...
  doc.Close();

  ChangePageOrder(filePath);

我哪里做错了?

谢谢。

最佳答案

您的代码无法工作,因为您正在使用 path 创建 PdfReader 以及创建 FileStream。您可能会收到诸如“文件正在使用中”或“无法访问文件”之类的错误。

这里解释一下:

您创建了一个名为 baosMemoryStream(),但您没有在任何地方使用该对象。解决问题的一种方法是,当您首次使用 MemoryStream 创建 PDF 时,替换 FileStream,然后使用存储在该内存流中的字节来创建 PdfReader 实例。在这种情况下,PdfStamper 将不会写入正在使用的文件。

另一个选择是使用不同的路径。例如:首先将文档写入名为 my_story_unordered.pdf 的文件(由 PdfWriter 创建),然后将文档写入名为 my_story_reordered.pdf 的文件(由 PdfStamper 创建)。

也可以一次性创建最终文档。在这种情况下,您需要切换到线性模式。我的书“iText in Action - Second Edition”中有一个示例展示了如何执行此操作:MovieHistory1

在此示例的 C# 端口中,您有:

writer.SetLinearPageMode();

正常情况下,iText会创建一个有枝有叶的页面树。一旦一个分支有超过 10 个叶子,就会创建一个新分支。使用setLinearPageMode(),您可以告诉 iText 不要这样做。完整的页面树将由一个分支组成,除了叶子之外什么都没有(没有额外的分支)。从查看文档时的性能角度来看,这很糟糕,但如果文档中的页数有限,这是可以接受的。

切换到页面模式后,您可以像这样重新排序页面:

document.NewPage();
// get the total number of pages that needs to be reordered
int total = writer.ReorderPages(null);
// change the order
int[] order = new int[total];
for (int i = 0; i < total; i++) {
  order[i] = i + toc;
  if (order[i] > total) {
    order[i] -= total;
  }
}
// apply the new order
writer.ReorderPages(order);

总结:如果您的文档页面不多,请使用 ReorderPages 方法。如果您的文档有很多页,请使用您一直在尝试的方法,但要正确操作。不要尝试写入您仍在尝试读取的文件。

关于java - 在 iTextSharp 中更改 PDF 文档的页面顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39166723/

相关文章:

Java Class.forName 和混淆名称,java 找不到类

java - 使用 JAVA 在 Windows 中为自定义硬件编写 WMI 提供程序

c# - 如何让 File.OpenText 返回不可为空的 StreamReader

c# - 在 JsonSerializerSettings 中将 null 更改为空

html - Laravel Blade 中生成的 PDF 中未显示 Font Awesome 图标

pdf - 在 Unity 中打开 pdf 文件

java - Java 中的分层互斥锁

java - 如何在套接字连接中下载图像并删除不需要的字节

c# - 在 SharePoint 计时器作业中创建发布页面会引发 MissingMethodException

java - 如何使用 java 解析 pdf,其中使用 latex 生成(以获取章节或部分等结构)