5

iText を使用して PDF を生成しています。各ページにヘッダー (およびフッター) を追加するカスタム PdfPageEventHelper を作成しました。

私の問題は、画像を追加する方法がわからないため、「ヘッダーボックス」に表示されることです。ドキュメントのコンテンツ自体に画像を追加する方法しか知りません(それが理にかなっている場合)。

ここにいくつかのコードスニペットがあります...

public static void main(String[] args) {
  Rectangle headerBox = new Rectangle(36, 54, 559, 788);
  /* ... */
  Document document = new Document(PageSize.A4, 36, 36, 154, 54);
  PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILENAME));
  HeaderFooter event = new HeaderFooter();
  writer.setBoxSize("headerBox", headerBox);
  writer.setPageEvent(event);
  document.open();
  addContent();
  document.close();
}

static class HeaderFooter extends PdfPageEventHelper {

  public void onEndPage(PdfWriter writer, Document document) {
    Rectangle rect = writer.getBoxSize("headerBox");
    // add header text
    ColumnText.showTextAligned(writer.getDirectContent(),
      Element.ALIGN_RIGHT, new Phrase("Hello", fontHeader1),
      rect.getLeft(), rect.getTop(), 0);

    // add header image
    try {
      Image img = Image.getInstance("c:/mylogo.PNG");
      img.scaleToFit(100,100);
      document.add(img);
    } catch (Exception x) {
      x.printStackTrace();
    }

  }

}

ヘッダーに画像を追加する適切な方法に関する提案は大歓迎です!!

ロブ

4

4 に答える 4

11

あなたは2つの大きな間違いを犯しています。

  1. 新しいページごとにオブジェクトの新しいインスタンスを作成しています。これにより、画像のバイトがページの数だけ追加されるため、PDFが肥大化します。メソッドのImage外部でオブジェクトを作成し、再利用してください。onEndPage()このように、画像バイトは1回だけPDFに追加されます。
  2. 文書化されているように、パラメータとしてメソッドにDocument渡されるのはonEndPage()、読み取り専用パラメータと見なす必要があります。それにコンテンツを追加することは禁じられています。これは、で作成したオブジェクトとは異なるオブジェクトですnew Document(PageSize.A4, 36, 36, 154, 54)。実際には、インスタンスPdfDocumentによって内部的に作成されたクラスのPdfWriterインスタンスです。PdfContentByte画像を追加するには、ライターからを取得し、を使用して画像を追加する必要がありますaddImage()

このようなエラーは、ドキュメントを読むことで簡単に回避できます。私の本iTextinActionを読むことで、時間を大幅に節約できます。

于 2012-10-18T06:25:40.677 に答える
4

試してみませんか

img.setAbsolutePosition(10, 10);
writer.getDirectContent().addImage(img);

それ以外の

document.add(img);

内部onPageEnd

于 2012-10-17T20:34:25.957 に答える
0

ページの上部に画像を追加するための一般的なソリューション。画像を上に配置することでもできます。それはあなたの要件を修正するかもしれません

public static void main(String[] args) throws MalformedURLException, IOException, DocumentException {
      Document document = new Document();
        try {
            PdfWriter.getInstance(document,
                    new FileOutputStream("HelloWorld.pdf"));
            document.open();

            //
            // Scale the image to a certain percentage
            //
            String filename = "image.jpg";
            Image image = Image.getInstance(filename);
            image = Image.getInstance(filename);
            image.scalePercent(200f);
            image.setAbsolutePosition(0, (float) (PageSize.A4.getHeight() - 20.0));
            System.out.println(image.getScaledHeight());
            document.add(image);

            //
            // Scales the image so that it fits a certain width and
            // height
            //
            image.scaleToFit(100f, 200f);
            document.add(image);
            document.add(new Chunk("This is chunk 3. "));
            System.out.println("created");
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        } finally {
            document.close();
        }
}

}

于 2016-03-16T07:23:48.450 に答える
0

絶対位置と配置を画像に設定しました(この場合、画像をヘッダーに配置しました)

    try {
        Image img = Image.getInstance("url/logo.png");
        img.scaleToFit(100,100);  
        img.setAbsolutePosition((rect.getLeft() + rect.getRight()) / 2 - 45, rect.getTop() - 50);
        img.setAlignment(Element.ALIGN_CENTER);          
        writer.getDirectContent().addImage(img);
      } catch (Exception x) {
        x.printStackTrace();
      }

ドキュメントのヘッダーとフッターにスペースを区切るために、ドキュメントの余白も調整しました。

document.setMargins(20, 20, 100, 100);
于 2015-03-12T10:43:58.180 に答える