2017-09-23 231 views
3

我试图逐页分割PDF文件,并获取每个页面文件的字节数组。但是,我无法将C#中的每个页面转换为iText 7.0.4版本中的字节数组。iText 7.0.4.0 - 将PdfDocument转换为字节数组

其他解决方案中引用的方法依赖于PdfWriter.GetInstance或PdfCopy,这似乎不再存在于iText版本7.0.4中。

我已经通过了iText的示例代码和API文档,但是我一直无法从中提取任何有用的信息。

using (Stream stream = new MemoryStream(pdfBytes)) 
using (PdfReader reader = new PdfReader(stream)) 
using (PdfDocument pdfDocument = new PdfDocument(reader)) 
{ 
    PdfSplitter splitter = new PdfSplitter(pdfDocument); 

    // My Attempt #1 - None of the document's functions seem to be of help. 
    foreach (PdfDocument splitPage in splitter.SplitByPageCount(1)) 
    { 
     // ??  
    } 

    // My Attempt #2 - GetContentBytes != pdf file bytes. 
    for (int i = 1; i <= pdfDocument.GetNumberOfPages(); i++) 
    { 
     PdfPage page = pdfDocument.GetPage(i); 
     byte[] bytes = page.GetContentBytes(); 
    } 
} 

任何帮助将不胜感激。

+0

你处理一个压缩的pdf?压缩单个页面不会产生与整个文件压缩时相同的字节。所以你应该找到一个更好的方式来定义成功比“返回文件中找到的相同字节” –

+0

不,我正在处理未压​​缩的PDF文件。我所需要的只是能够分割PDF文件并存储拆分页面供以后使用。一旦它们分离,我不必担心将原始文档重新放在一起。 –

回答

3

您使用PdfSplitter的方法是处理您的任务的最佳方法之一。也许没有那么多是可用的,但PdfSplitter是高度可定制的,如果你看一下实现或简单的API,就会明确哪些是注入你自己的定制行为的正确点。

您应该覆盖GetNextPdfWriter以提供您希望创建文档的任何输出媒体。您也可以使用IDocumentReadyListener来定义一旦其他文档准备就绪后将执行的操作。

我附上能够实现自己的目标的实现的一个:像你一样

class ByteArrayPdfSplitter : PdfSplitter { 

    private MemoryStream currentOutputStream; 

    public ByteArrayPdfSplitter(PdfDocument pdfDocument) : base(pdfDocument) { 
    } 

    protected override PdfWriter GetNextPdfWriter(PageRange documentPageRange) { 
     currentOutputStream = new MemoryStream(); 
     return new PdfWriter(currentOutputStream); 
    } 

    public MemoryStream CurrentMemoryStream { 
     get { return currentOutputStream; } 
    } 

    public class DocumentReadyListender : IDocumentReadyListener { 

     private ByteArrayPdfSplitter splitter; 

     public DocumentReadyListender(ByteArrayPdfSplitter splitter) { 
      this.splitter = splitter; 
     } 

     public void DocumentReady(PdfDocument pdfDocument, PageRange pageRange) { 
      pdfDocument.Close(); 
      byte[] contents = splitter.CurrentMemoryStream.ToArray(); 
      String pageNumber = pageRange.ToString(); 
     } 
    } 
} 

的通话将基本上,而是使用自定义文档准备事件:

PdfDocument docToSplit = new PdfDocument(new PdfReader(path)); 
ByteArrayPdfSplitter splitter = new ByteArrayPdfSplitter(docToSplit); 
splitter.SplitByPageCount(1, new ByteArrayPdfSplitter.DocumentReadyListender(splitter)); 
+0

非常感谢!我应该更仔细地阅读文档...唯一的是pageRange.ToString()返回一个对象类型的字符串,所以我使用了GetQualifyingPageNums,并对解决方案进行了一些修改,以获得每个页面的正确页码页。我没有修改你的解决方案,因为这是特定于我的情况。 –