在iTextSharp

时间:2016-08-26 12:46:59

标签: java c# pdf itext

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

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

我想把我的TOC放在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);

我做得对不对?

谢谢。

2 个答案:

答案 0 :(得分:1)

您的代码无法正常运行,因为您使用path创建PdfReader以及创建FileStream。您可能会收到错误,例如"该文件正在使用"或"无法访问该文件"。

这在此解释:

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

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

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

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

PdfStamper

在正常情况下,iText将创建一个带有分支和叶子的页面树。一旦分支有超过10个叶子,就会创建一个新分支。使用writer.SetLinearPageMode(); ,您告诉iText不要这样做。完整的页面树将包含一个除了叶子之外什么都没有的分支(没有额外的分支)。从查看文档时的性能来看,这是不好的,但如果文档中的页数有限,则可以接受。

一旦您切换到页面模式,您可以重新排序页面,如下所示:

setLinearPageMode()

总结:如果您的文档没有多页,请使用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); 方法。如果您的文档有很多页面,请使用您正在尝试的方法,但要正确执行。不要尝试写入您仍在尝试阅读的文件。

答案 1 :(得分:0)

如果不详细了解您应该做什么,您可以循环浏览pdf中的所有页面,将它们放入包含所有页面的新pdf文档中。你可以把你的逻辑放在for循环中。

reader = new PdfReader(sourcePDFpath);
sourceDocument = new Document(reader.GetPageSizeWithRotation(startpage));
pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream(outputPDFpath, System.IO.FileMode.Create));

sourceDocument.Open();

for (int i = startpage; i <= endpage; i++)
{
    importedPage = pdfCopyProvider.GetImportedPage(reader, i);
    pdfCopyProvider.AddPage(importedPage);
}
sourceDocument.Close();
reader.Close();