2017-07-14 27 views
0

バイト入力ストリームを動的に作成してPDFに変換するコードがあります。私はiText 5.1.2のバージョンを使用しています。コードは、Pdfreader上でgetNumberOfPages()メソッドを呼び出して、それを反復処理し、完全なPDFを構築しますが、このメソッドが1を返して、最初のページだけが印刷されます。 2ページ目に入るデータが失われています。 文字列の内容がPDFに変換されるのを見ると、上流のすべてのデータが表示されます。以下は私のコードです:私はあなたの質問を理解して何からPdfReader getNumberOfPages()は常に1ページだけを返します

int getPageCount(String str) throws Exception{ 
    Document doc = new Document(); 
    ByteArrayOutputStream out = new ByteArrayOutputStream();; 
    str = str.replaceAll("</lf>", "\n"); 
    PdfCopy copy = new PdfCopy(doc, out); 
    doc.open(); 
    PdfReader reader; 
    reader = new PdfReader(new ByteArrayInputStream(str.getBytes())); 
    int i = reader.getNumberOfPages(); 
    for (int page = 0; page < i;) { 
     copy.addPage(copy.getImportedPage(reader, ++page)); 
    } 
    copy.freeReader(reader); 
    doc.close(); 
    out.flush(); 
    return i; 
} 
+1

こんにちはとスタックオーバーフローを歓迎する、通過する時間がかかるしてください(HTTPS [ツアーを歓迎]。ここであなたのやり方を知るために(そして最初のバッジを得るため)、[最小限の、完全で、証明可能な例(https://stackoverflow.com/help/mcve)を作成する方法、 [良い質問をする方法](https://stackoverflow.com/help/how-to-ask)フィードバックと有用な回答を得るチャンスを増やす。 – DarkCygnus

+0

あなたのソースを正しく読んでいますか?あなたは、文字列を取る、いくつかの文字列の操作を行う、バイト配列にエンコードし、PDFとして読むことを試みる?それはあなたがそれを読むことができますすべてのPDFを読むことが運がいいです... – mkl

答えて

2

、あなたは、PDF文書に特定の文字列を印刷することにより取り込まれるだろうどのように多くのページを推定しようとしています。

より良い(iText7 !!)これを行う方法は次のようになります// stackoverflowの:

public static void main(String[] args) 
{ 
    for(int i=0;i<100;i++) 
     System.out.println(i + "\t" + getPageCount(lipsum(i))); 
} 

static int getPageCount(String str) 
{ 
    OutputStream out = new ByteArrayOutputStream(); 
    PdfWriter writer = new PdfWriter(out); 
    PdfDocument pdfDocument = new PdfDocument(writer); 
    Document layoutDocument = new Document(pdfDocument); 
    layoutDocument.add(new Paragraph(str)); 
    return pdfDocument.getNumberOfPages(); 
} 

static String lipsum(int nofRepeats) 
{ 
    String retval = ""; 
    String base = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 
    for(int i=0;i<nofRepeats;i++) 
    { 
     retval += base; 
    } 
    return retval; 
} 
+0

これは明らかに質問がバージョン5.1.2を参照している間、iText 7の答えと思われる。あなたの答えの読者の側での不満を避けるためには、あなたの答えで少なくともそれを明確にすべきです。 – mkl

+0

私はiText7の発言を追加しました。 –

+0

iTextの特定のバージョンにバインドされていない場合は、pfdHTMLの使用を検討してください。 –

関連する問題