2016-08-26 10 views
0

私のPDF文書の並べ替えページを変更しようとしていますが、その理由がわかりません。iTextSharpのPDF文書の注文ページを変更します。

私はjava(iText)と私はそれにいくつかの問題があります(exampl1exampl2example3)の順序を変更するいくつかarticalsを読んでください。この例は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); 

私は何右ではない?

ありがとうございます。

答えて

1

。おそらく、「ファイルが使用中です」や「ファイルにアクセスできません」などのエラーが発生します。

これは、ここで説明されています

あなたはbaosという名前MemoryStream()を作成していますが、どこでも、そのオブジェクトを使用していません。問題を解決する1つの方法は、MemoryStreamで最初にPDFを作成するときにFileStreamを置き換え、そのメモリストリームに格納されたバイトを使用してPdfReaderインスタンスを作成することです。その場合、PdfStamperは使用中のファイルに書き込まれません。

もう1つのオプションは、別のpathを使用することです。たとえば、最初にmy_story_unordered.pdfというファイル(PdfWriterで作成)に文書を書き込んだ後、文書をmy_story_reordered.pdfというファイル(PdfStamperで作成)に書き込みます。

最終ドキュメントを一度に作成することもできます。その場合、線形モードに切り替える必要があります。 「アクションでiTextの - Second Editionの」私の本の例がありますこれを行う方法を示しています。この例のC#のポートでMovieHistory1

は、あなたが持っている:通常の状況で

writer.SetLinearPageMode(); 

、iTextの意志枝と葉を持つページツリーを作成します。ブランチに10枚以上の葉があるとすぐに、新しいブランチが作成されます。 setLinearPageMode()では、iTextにこれをしないように指示します。完全なページツリーは、1つのブランチで構成され、残りのブランチはありません(余分なブランチはありません)。これは、ドキュメントを表示するときのパフォーマンスの観点から悪いですが、ドキュメント内のページ数が限られている場合は問題ありません。あなたはページモードに切り替えたら

、あなたがこのようなページを並べ替えることができます。

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メソッドを使用します。文書に多数のページがある場合は、実験した方法を使用しますが、正しく行います。まだ読もうとしているファイルに書き込もうとしないでください。

+0

私は 'ReorderPages'を使用しようとしましたが、文書が壊れています。なにが問題ですか?あなたのコードをコピーし、それをtocを作成した後に置いています。 – Naomiss

+0

ウェブサイトで共有されている例が動作します。誰かがあなたの質問に「何が間違っている?」と答えることを期待しないでください。あなたは、人々があなたがしていることを見ることができると仮定します。それは真実ではない。これまでのすべての質問から、私はあなたが開発者ではないことのみを知っています。あなたは何をしているのか理解せずに、他の人からコードをコピー/ペーストするだけです。私はあなたの最大の間違いだと思う。私は誰もあなたがこれを解決できるとは思わない。あなたはより良い仕事態度を成長させ、よりスマートになるよう努力する必要があります。 –

+0

あなたの批評家に感謝します。私はより良くなるように努力していきます。 – Naomiss

0

あなたは何をすべきかについて詳しくは触れずに、PDFからすべてのページをループすることができます。すべてのページを含む新しいpdfドキュメントに入れてください。あなたのロジックをforループの中に置くことができます。あなたがPdfReaderを作成するだけでなく、FileStreamを作成するためにpathを使用しているので、あなたのコードが動作しないことができる

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

私の文書が十分な大きさであれば問題ありませんか? – Naomiss

+0

私はあなたの限界があなたのRAMだと思うでしょう。 – pmeyer

関連する問題