2017-10-22 218 views
0

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

我目前只是试图建立第二页后移动第一页的例子:

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(); 
+0

'new List (1)'创建一个**空列表**,**容量为1 **。你可能想要做'新列表 {1}'(带花括号),它创建一个列表,一个条目,一个'1'。 – mkl

+0

@mkl哦,我的愚蠢举动。这似乎工作。现在任何建议'src.GetPage(1).CopyTo(dest);'? – derekantrican

+0

'src.GetPage(1).CopyTo(dest)'将页面*数据*从源复制到目的地,它只是不会将其添加到目标页面树中。这就是为什么'CopyTo'返回一个页面对象,你可以使用'dest.AddPage(...)';这允许您在任何想要的位置插入页面。 – mkl

回答

1

你应该阅读FAQ条目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对象创建一个PdfDocumentresultDocPdfDocument使用PdfWriter对象创建。

+0

这是一个java的例子。此外,'PdfDocument.CopyPagesTo'和'PdfPage.CopyTo'方法似乎没有在C#中做任何事情(除非我使用错误)。使用这些后,“'resultDoc'”仍然有0个页面 – derekantrican

+0

此解决方案似乎删除文档级元数据(除非手动复制它们),而iText 5版本使用“PdfReader.selectPages”和“PdfStamper”自动保留它们。不应该有一个解决方案来保存所有文档级别的数据吗? – mkl

+0

@derekantrican *“(除非我错误地使用它们)”* - 让我们检查一下你是否应该展示你如何使用它们。特别是你的源文件和目标文件有什么不同? – mkl

2

正如@布鲁诺指出的,人们可以使用PdfDocument方法CopyPagesTo的超负荷容易地重新排序PDF文档与iText 7。

关于你尝试

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

    CopyTo(dest)复制页面数据从源到目的地,它只是不但它添加到目标页面树。这就是为什么CopyTo返回一个页面对象,您可以使用该对象,并使用dest.AddPage(...)过载;这特别允许你在任何想要的位置插入页面。

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

    new List<int>(1)容量的1创建空列表。你可能想要做new List<int> { 1 }(带花括号),它创建一个条目列表,1