2011-10-20 31 views
4

グラフィックスを描いてPDFに書き込む例を完成しようとしていますが、PDFにはページがないというエラーが出ています。開いた後にdocument.add()で単純なものを追加してもうまくいけば、グラフィックは表示されません。私のコードは次のとおりです。iTextを使用してグラフィックスをPDFに描画するにはどうすればよいですか?

Document document = new Document(); 
PdfWriter writer = new PdfWriter(); 
response.setContentType("application/pdf"); 
response.setHeader("Content-Disposition", 
    " attachment; filename=\"Design.pdf\""); 

writer = PdfWriter.getInstance(document, response.getOutputStream()); 

document.open();  
PdfContentByte cb = writer.getDirectContent(); 
Graphics2D graphics2D = cb.createGraphics(36, 54); 
graphics2D.drawString("Hello World", 36, 54); 
graphics2D.dispose(); 
document.close(); 

グラフィックをドキュメントに追加するために何かする必要がありますか、または構文が間違っていますか?

+0

(つまりはずっと前に、長いの世話を得ているだろうバグの一種です)文書に段落を追加すると、これにどんな違いがあることを想像することはできませんグラフィックを追加する前に文書を最初に修正してください。それが彼が私に言うことを試みていたかもしれないので、Stykenの正しいことをマークするつもり。誰かがこれを説明したいと思ったら私は賞金を授与するでしょう。 – jimdrang

+0

ok - 完全な説明 –

答えて

4

Document doc = new Document(PageSize.A4); 違いがありますか?

あなたはこのようなParagraphを追加する必要がある場合、私は知らない。

doc.add(new Paragraph(...)); 

はまた、我々は、画像を追加するためにdoc.add(ImgRaw);を使用しています。

+0

Graphics2Dオブジェクトは、文字列や画像のようにdoc.add()で受け入れられません。ページサイズA4を試しましたが、運はありません。 – jimdrang

+0

また、オブジェクトを受け入れて段落を文書に追加するが、「不当な要素の挿入:PdfGraphics2Dを要素にキャストできない」ため、graphics2Dオブジェクトを段落に追加しようとしました。 – jimdrang

3

それほど遠すぎないと、私はあなたの一般的なアプローチが良いと思います。私はここで何が起こっているかもしれないと思うのは、Graphics2Dの原点がPDFの原点と異なるため、drawString()の呼び出しを変更して0,0を位置として使用する必要があるでしょうか?

+0

私はそれを試みましたが、それと同じエラー(java.io.IOException:ドキュメントにページがありません)。ほとんど何も書こうとしていないのと同じです。 – jimdrang

+0

また、PDF座標系のy軸が上がってグラフィックス2dがダウンしてしまいますが、同じ結果が得られたので(0,54)試しました。 – jimdrang

+0

ああ - 私は慎重に十分読んでいませんでした - ドキュメントに問題はありません。 –

3

私は問題は直接の内容がページオブジェクトに直接書き込むことだと思います。この方法で、背景や背景画像を追加できます。ダイレクトコンテンツに書き込む前に新しいページ(doc.newPage())を追加してみてください。

+0

同じ結果です。私はこれが少なくとも空白のページでPDFを開くだろうと思ったが、同じエラー。 – jimdrang

+0

http://itextpdf.com/themes/keyword.php?id=56のサンプルを見てみましたか?たぶん彼らはあなたを助けることができます... –

3

テキストの代わりに図形を使用するg2dオブジェクトで描画操作を試したことがありますか?そうすれば、フォントの選択やそのようなことで、何か不思議なことが起こる可能性が排除されます。

iText第12章では、あなたが探しているものを正確に持っています。本当に価値があります。 Preview of Chapter 12

+0

私はいくつかの簡単な長方形と偶数行を試してみました。 – jimdrang

6

私はITextの専門家ではありませんが、先週私はそれでいくつかの円を描こうとしました。だから、これは私が私のテスト中に気づいているものです:

あなたはグラフィックスを描画する場合は、(または私はそれをしようと試みたときに私がしなければならないと言うことができます)しなければならない部分でのグラフィックスコマンドがsaveState()で始まり、終わる「ラップ」 restoreState()で、私はfillStroke()を呼び出す必要がありました。私がfillStroke()を呼び出さなかった場合、何も描画されませんでした。

private void circle(float x, float y, PdfWriter writer) { 
    PdfContentByte canvas = writer.getDirectContent(); 

    canvas.saveState(); 
    canvas.setColorStroke(GrayColor.BLACK); 
    canvas.setColorFill(GrayColor.BLACK); 
    canvas.circle(x, y, 2); 
    canvas.fillStroke(); 

    canvas.restoreState(); 
} 

@Test 
public void testPossition() throws DocumentException, IOException { 
    OutputStream outputStream = FileUtil.openOutputStream("testPosition.pdf"); 
    //this is my personal file util, but it does not anything more 
    //then creating a file and opening the file stream. 

    Document document = new Document(PageSize.A4, 50, 50, 50, 50); 
    PdfWriter writer = PdfWriter.getInstance(document, outputStream); 
    document.open(); 

    markPosition(100, 100, writer); 
    document.add(new Paragraph("Total: 595 x 842 -- 72pt (1 inch)")); 

    document.close(); 
    outputStream.flush(); 
    outputStream.close(); 
} 

private void markPosition(float x, float y, PdfWriter writer) 
     throws DocumentException, IOException { 
    placeChunck("x: " + x + " y: " + y, x, y, writer); 
    circle(x, y, writer); 
} 

private void placeChunck(String text, float x, float y, PdfWriter writer) 
     throws DocumentException, IOException { 
    PdfContentByte canvas = writer.getDirectContent(); 
    BaseFont font = BaseFont.createFont(BaseFont.HELVETICA, 
        BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
    canvas.saveState(); 
    canvas.beginText(); 
    canvas.moveText(x, y); 
    canvas.setFontAndSize(font, 9); 
    canvas.showText(text); 
    canvas.endText(); 
    canvas.restoreState(); 
} 

しかしPdfContentByte(キャンバス)は、例えばrectangleため、より多くの機能を有しています。

1

私はちょうどiTextのの最新HEADに対して一緒に、次のユニットテストを置く:

Document document = new Document(); 
    PdfWriter writer = new PdfWriter(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    writer = PdfWriter.getInstance(document, baos); 

    document.open();  
    PdfContentByte cb = writer.getDirectContent(); 
    Graphics2D graphics2D = cb.createGraphics(36, 54); 
    graphics2D.setColor(Color.black); 
    graphics2D.drawRect(0, 0, 18, 27); 

    Font font = new Font("Serif", Font.PLAIN, 10); 
    graphics2D.setFont(font); 

    graphics2D.drawString("Yo Adrienne", 0, 54); 


    graphics2D.dispose(); 
    document.close(); 

    TestResourceUtils.openBytesAsPdf(baos.toByteArray()); 

、それが正常に動作します - 私は、ページに加え、テキストの左下隅にある小さな黒い四角形を取得します。私はdrawStringメソッドにX = 0を指定していることに注意してください(テキストをイメージ境界外にレンダリングさせる36を指定しています)。フォントを明示的に指定していることにも注意してください。もしそれを残しておけばそれはレンダリングされますが、通常、そのようなもののデフォルトを信頼しないのは良い考えです。最後に、私は明示的に前景の色を設定します。本当に必要ではありませんが、デフォルトを信頼することは恐ろしいことがあります。

ここで重要なのは、x = 36にテキストを配置したことです。

私のテストでは、PDFにページがないというエラーを作成することはできませんでした。取得している例外のスタックトレースを投稿できますか?

私はに空白または何かを追加するので、

関連する問題