2017-09-23 28 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を使用するあなたのアプローチは、あなたのタスクに近づける最善の方法の1つです。おそらくそれほど多くはありませんが、PdfSplitterは高度にカスタマイズ可能で、実装やAPIを見れば、独自のカスタマイズされた動作を注入するための正しい点が明らかになります。

文書を作成する出力メディアを提供するには、GetNextPdfWriterを上書きする必要があります。 IDocumentReadyListenerを使用して、別の文書の準備が完了したら実行されるアクションを定義することもできます。

私はあなたの目標を達成することができます実装の1つを添付しています:

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(); 
     } 
    } 
} 

呼び出しは基本的にあなたが行ったように、しかし、カスタムドキュメントreadyイベントで次のようになります。

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

ありがとうございます!私はもっ​​と慎重にドキュメントを読んでいたはずです...唯一のことは、pageRange.ToString()がオブジェクト型の文字列を返すため、GetQualifyingPageNumsを使用してソリューションにわずかな変更を加え、それぞれに正しいページ番号を取得しますページ。これは私の場合に固有のものなので、私はあなたのソリューションを変更していません。 –

関連する問題