2017-01-28 9 views
0

Пару дней назад я задал этот вопрос: Itext PDF How To Add HTML Pre-formatted to PDF, но @ Брюно-lowagie сказал мне, чтобы следовать инструкциям на этой существующей теме: How To Add HTML Headers And Footers to a Page, я тщательно следовал инструкции, но обнаружил, что это подход работает для простых HTML колонтитулов, как:ItextPDF добавления заголовков комплекса Формат

<h1>Header Only Line</h1> 

или

<h2>Footer Only Line</h2> 

Но мой случай использования требует, чтобы добавить более сложные данные в верхний и нижний колонтитулы, как образы, поэтому я попытался Wi й заголовок, который имеет IMG элемент, указывающий на изображение в том же сервере, как это:

http://localhost:8080/DocGen/resources/images/main_header.jpg 

я добавил начало и конец «метки», чтобы увидеть, если они получили обработаны таким образом мой заголовок был так:

<p>----Header Start---</p> 

<p><img alt="" src="http://localhost:8080/DocGen/resources/images/main_header.jpg" style="height:126px; width:683px" /></p> 

<p>--Header End--</p> 

Но я получаю выход PDF, как это:

Output PDF NO Image on Header

Отредактировано: Как вы можете видеть, что он не показывает изображение, а также не показывает мою конечную метку.

Что мне делать, чтобы успешно добавлять верхние и нижние колонтитулы с встроенными изображениями?

Большое спасибо.

P.S: Извините за неудобства, поскольку я новичок здесь, и я надеюсь, что мой вопрос ясен.

EDIT: Код, это как в другом потоке:

 public class HtmlHeaderFooter { 
     private String DEST = null;//"results/events/html_header_footer.pdf"; 
     private String HEADER = null; 
     private String FOOTER = null; 

     private float leftMargin; 
     private float rightMargin; 
     private float topMargin; 
     private float bottomMargin; 

     private Rectangle pageSize = null; 

     public class HeaderFooter extends PdfPageEventHelper { 
      protected ElementList header; 
      protected ElementList footer; 
      public HeaderFooter() throws IOException { 

       header = XMLWorkerHelper.parseToElementList(HEADER, null); 
       footer = XMLWorkerHelper.parseToElementList(FOOTER, null); 
      } 
      @Override 
      public void onEndPage(PdfWriter writer, Document document) { 
       try { 

        ColumnText ct = new ColumnText(writer.getDirectContent()); 
        ct.setSimpleColumn(new Rectangle(36, 832, 559, 810)); 
        for (Element e : header) { 
         System.out.println("Element on header: " + e.toString()); 
         ct.addElement(e); 
        } 
        ct.go(); 
        ct.setSimpleColumn(new Rectangle(36, 10, 559, 32)); 
        for (Element e : footer) { 
         System.out.println("Element on footer: " + e.toString()); 
         ct.addElement(e); 
        } 
        ct.go(); 

       } catch (DocumentException de) { 
        throw new ExceptionConverter(de); 
       } 
      } 
     } 

    public void createPdfAlt(String outputFile, String inputFile){ 
      Document document = new Document(pageSize, leftMargin, rightMargin, topMargin, bottomMargin); 

      FileOutputStream outputStream; 
      try { 
       outputStream = new FileOutputStream(DEST); 
       //System.out.println("Doc: " + document.); 
       PdfWriter writer = PdfWriter.getInstance(document, outputStream); 
        writer.setPageEvent(new HeaderFooter()); 
document.open(); 

      PdfContentByte cb = writer.getDirectContent(); 

      // Load existing PDF 
      PdfReader reader = new PdfReader(new FileInputStream(inputFile)); 
      PdfImportedPage page = writer.getImportedPage(reader, 1); 
     // document.setPageSize(reader.getPageSize(1)); 
      // Copy first page of existing PDF into output PDF 
      document.newPage(); 
      cb.addTemplate(page, 0, 0); 
document.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (DocumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

В моем Managed Bean я установил верхний и нижний колонтитулы, выходной_файл и так далее:

HtmlHeaderFooter htmlHeaderFooter = new HtmlHeaderFooter(); 
      htmlHeaderFooter.setFOOTER(footerContent); 
      htmlHeaderFooter.setHEADER(headerContent); 


      //htmlHeaderFooter.setPageSize(xml2pdf.getPageSize()); 
      htmlHeaderFooter.setPageSize(com.itextpdf.text.PageSize.A4); 
      htmlHeaderFooter.setLeftMargin(template2Export.getLeftMargin()); 
      htmlHeaderFooter.setRightMargin(template2Export.getRightMargin()); 
      htmlHeaderFooter.setTopMargin(template2Export.getSuperiorMargin()); 
      htmlHeaderFooter.setBottomMargin(template2Export.getInferiorMargin()); 

      htmlHeaderFooter.setDEST("salidaConHeaderAndFooter.pdf"); 
      htmlHeaderFooter.createPdfAlt("PDFCompleto1.pdf", "test3.pdf"); 

EDIT 2 : Заголовок должен выглядеть так:

Sample Header in Output PDF

Если говорить о HTML код "как есть", это так:

<p>----Header Start---</p> 

    <p><img alt="" src="http://localhost:8080/DocGen/resources/images/main_header.jpg" style="height:126px; width:683px" /></p> 

    <p>--Header End--</p> 
+0

Пожалуйста, покажите свой код. – mkl

+0

Здравствуйте @mkl Я редактировал сообщение с кодом, который я использую. Большое спасибо за ваше время. – OZWolverine

+0

Как выглядит внешний вид заголовка html, включая изображение. – mkl

ответ

0

Вы рисуете заголовок здесь:

ct.setSimpleColumn(new Rectangle(36, 832, 559, 810)); 

Так вы позволяете около 22pt высоты (832 - 810), чтобы нарисовать весь материал заголовка.

С другой стороны, ваш заголовок, как ожидается, чтобы отобразить этот

<p>----Header Start---</p> 

<p><img alt="" src="http://localhost:8080/DocGen/resources/images/main_header.jpg" style="height:126px; width:683px" /></p> 

<p>--Header End--</p> 

Этот заголовок требует два абзаца плюс 126px (94.5pt). Таким образом, он не подходит. Следовательно, рисуется только первый абзац (который является единственным содержимым заголовка).

Возможно, вы захотите начать с разрешения большого количества пространства, например.

ct.setSimpleColumn(new Rectangle(36, 832, 559, 0)); 

, а затем уменьшить его шаг за шагом в соответствии с вашими требованиями.

+0

Здравствуйте, @mkl, большое спасибо, позвольте мне проверить, чтобы вы знали, я, наверное, должен сначала изучить, как работать с Rectangle. – OZWolverine

 Смежные вопросы

  • Нет связанных вопросов^_^