飛行皿(xHTMLRenderer)とiTextでヘッダー/フッターを生成する

私はこの質問が以前に尋ねられたことを認識しています(私はすべてのソリューションを見て、それらを試しました)が、私はまだすべてのページで繰り返すヘッダーとフッターでpdfドキュメントを生成しようとしています。

私は iText2.0.8 飛行皿 R8を使用しています。私がテストしたいくつかの方法は、実行要素とマージンを使って https://gist.github.com/626264 でしたボックス http://pigeonholdings.com/projects/ r8 http:// today。 java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html#page-specific-features 、他にもたくさんの方法があります私のために働かない。

私のヘッダーの div には画像がある他の2つのdivがあり、私のフッターはページの番号付けのためのものです。 htmlはbufと呼ばれる StringBuffer に入れられています。

buf.append("<head>");
    buf.append("<title>blabla</title> ");
    buf.append("</head>");
buf.append("<body>");
 buf.append("<div class='header' style='clear:both;'>");
    buf.append("<div id='moneyLogo' style='float:left'>"); 
    buf.append("Some alt text");
    buf.append("</div>");
    buf.append("<div id='canLogo' style='float:right'>");
    buf.append("alt text");
    buf.append("</div>");
    buf.append("

alt text

"); buf.append("<div style='text-align:center;'>"); buf.append("Some texy text"); buf.append("
");); buf.append("</div>"); buf.append("</div>

"); buf.append("<div id='footer'> Page of </div>"); buf.append("</body>"); buf.append("</html>");

My pdf generates fine except for the fact that the header only appears on the first page and the footer only appears on the bottom of the last page. When I put the html through the w3c validator it came out fine, but when I used their CSS validator it said that their were parse errors in the line @page { size:8.5in 11in; padding:1em; @bottom-left { content: element(footer); } }

As far as I could tell from all the guides I was reading this was fine. I also heard that the W3C CSS validator was incomplete for CSS3 specs so I assumed it was the validator who was wrong.

If anyone could give me some tips of where to look or ideas it would make my week :)

p.s. Has to use Flying saucer R8 and/or iText 2.0.8

20
将来のユーザーのためにコメントを残す:フライヤーのためにフッタがすべてのページで実行されていない場合は、フッタ要素が通常のHTMLページとは違ったBEFOREコンテンツであることを確認してください。以下の例は、@Giovanniによって見られます。これは、ヘッダーとフッターがコンテンツの前にあることを示しています。あなたのコードは正しいです、それはちょうどそのヘッダーとフッターが内容の前に置かれなければならないとそれは非常に直感的です
追加された 著者 Ganesh Krishnan,

3 答え

実際の例を次に示します。

package com.sg2net.test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;

public class XHTMLRenderer8 {

    /**
     * @author Giovanni Cuccu
     */
    public static void main(String[] args) throws FileNotFoundException, DocumentException {
        ITextRenderer renderer = new ITextRenderer();
        String content="<html><head></head>\n" +
          "<body><div class='header'>Header</div><div class='footer'>Footer</div><div class='content'>Page1</div><div>Page2</div></body></html>";
        renderer.setDocumentFromString(content);
        renderer.layout();
        renderer.createPDF(new FileOutputStream("test.pdf"));

    }

}

これは次のXHTMLドキュメントを使用しています

<html>
<head>

</head>
<body>
    <div class='header'>Header</div>
    <div class='footer'>Footer</div>
    <div class='content'>Page1</div>
    <div>Page2</div>
</body>
</html>
27
追加された
これは私が探していたものです。ありがとうございました!
追加された 著者 Alex,
ありがとう、私はこの方法を使用して終了し、それは私のために完全に働いた:)
追加された 著者 flyingCaffine,

多くのことを研究してテストした後、私は本当にうまくいくソリューションを考え出しました。

あなたはコントロールできます:

- margin-topを編集してヘッダーの高さを設定します。

- margin-bottomを編集することでフッターの高さ。

- div.contentの幅を編集してコンテンツ幅。

ページ番号はフッターに表示されます。

以下のコードを参照してください:

<html>
<head>

</head>
<body>

    <div class="header">
        This is the header that will repeat on every page at top
    </div>

    <div class="footer" >
        

This is the footer that will repeat on every page at bottom

Page of

/ </div> <div class="content">

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

This is the content

</div> </body> </html>

それが役に立てば幸い!!!

12
追加された
ありがとう!解決策は私のために働いた。
追加された 著者 Vinayak Dornala,

それはjava checkoutを使用してitext

public class HeaderAndFooter extends PdfPageEventHelper {

public void onEndPage (PdfWriter writer, Document document) {
    Rectangle rect = writer.getBoxSize("art");
    switch(writer.getPageNumber() % 2) {
    case 0:
        ColumnText.showTextAligned(writer.getDirectContent(),
                Element.ALIGN_RIGHT, new Phrase("even header"),
                rect.getBorderWidthRight(), rect.getBorderWidthTop(), 0);
        break;
    case 1:
        ColumnText.showTextAligned(writer.getDirectContent(),
                Element.ALIGN_CENTER, new Phrase(String.format("%d", writer.getPageNumber())),
                300f, 62f, 0);
        break;
    }
    ColumnText.showTextAligned(writer.getDirectContent(),
            Element.ALIGN_CENTER, new Phrase(String.format("%d", writer.getPageNumber())),
            (2f + 4f)/2, 2f - 18, 0);
}
}

ur pdfwriterの下で1つを使用して

HeaderAndFooter event = new HeaderAndFooter();
        writer.setPageEvent(event);
1
追加された
私は以前これのようなものを使っていましたが、フライトのソーサーコードとうまく統合できませんでした。あなたが飛んでいるソーサーなしでiTextだけを使用している場合はまだ便利です:)
追加された 著者 flyingCaffine,