Как добавить изображение в мой заголовок в сгенерированном iText PDF?

Я использую 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();
    }

  }

}

Любые предложения о том, как добавить изображение в шапку, приветствуются!

обкрадывать

 Denis Kniazhev17 окт. 2012 г., 22:22
Долженwriter вonEndPage обменяться сpdfWriter?
 Robert Hume18 окт. 2012 г., 02:20
@denisk Это опечатка, извините - но спасибо за хороший глаз.

Ответы на вопрос(4)

лучае я поместил свое изображение в заголовок)

    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);

Ты можешь попробовать

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

вместо

document.add(img);

внутриonPageEnd?

 Denis Kniazhev19 окт. 2012 г., 17:52
@RobertHume Я полностью согласен с вами в этом
 Robert Hume19 окт. 2012 г., 17:30
Спасибо, очень полезно, в конце дня ответ Бруно был более подробным и полезным, поэтому мне пришлось «проверить» его - надеюсь, вы понимаете! Еще раз спасибо.

ожем сделать это, разместив изображение вверху. это может исправить ваше требование

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();
        }
}

}

 mkl16 мар. 2016 г., 13:00
ОП говорит о добавлении изображения в прослушиватель событий страницы, и в таком прослушивателе вы не должны добавлять что-либо напрямую черезdocument.addср. например @ Ответ Бруно, пункт 2. Таким образом, ваше решение не применимо в данной ситуации.
Решение Вопроса

Вы создаете новый экземпляр объекта для каждой новой страницы. Это приведет к раздутому PDF, поскольку байты изображения будут добавляться столько раз, сколько страниц. Пожалуйста, создайтеImage объект за пределамиonEndPage() метод, и использовать его повторно. Таким образом, байты изображения будут добавлены в PDF только один раз.Как документально подтверждено,Document перешел кonEndPage() Метод как параметр должен рассматриваться как параметр только для чтения. Запрещено добавлять контент к нему. Это другой объект, чем тот, который вы создалиnew Document(PageSize.A4, 36, 36, 154, 54), На самом деле, это примерPdfDocument класс, созданный внутриPdfWriter экземпляр. Чтобы добавить изображение, вам нужно получитьPdfContentByte от автора, и добавьте изображение, используяaddImage().

Подобных ошибок можно легко избежать, прочитав документацию. Вы можете сэкономить много времени, читая мою книгуiText в действии.

 Denis Kniazhev18 окт. 2012 г., 20:29
@RobertHume Отправка нового вопроса - это путь
 Bruno Lowagie19 окт. 2012 г., 08:30
@denisk: что было понижено? Конечно, я проголосовал за вопрос и ответ.
 Bruno Lowagie19 окт. 2012 г., 08:29
@RobertHume Моим первым предположением будет то, что вы используете onStartPage () вместо onEndPage (), но я должен увидеть больше кода ...
 Denis Kniazhev18 окт. 2012 г., 10:20
С какой стати это было отвергнуто?
 Robert Hume18 окт. 2012 г., 17:08
@BrunoLowagie Очень полезно! Благодарю. Я буду проводить больше времени с твоей книгой. Между тем, то, что вы (и Дениск) предложили, работает, но имеет побочный эффект. Когда я добавляюimg.setAbsolutePosition(35,742); writer.getDirectContent().addImage(img); чтобы поместить изображение вверху каждой страницы, все содержимое моего документа (за исключением заголовка) переносится на вторую страницу. Первая страница пуста. Есть идеи, что я делаю не так? Я могу опубликовать новый вопрос stackoverflow с подробным кодом, если это поможет.

Ваш ответ на вопрос