【问题标题】:ItextPDF Adding Headers and Footers Complex FormatItextPDF 添加页眉和页脚复杂格式
【发布时间】:2017-06-14 06:05:36
【问题描述】:

几天前我问了这个问题: Itext PDF How To Add HTML Pre-formatted to PDF,但@bruno-lowagie 告诉我遵循现有线程的说明:How To Add HTML Headers And Footers to a Page,我仔细按照说明进行操作,但发现该方法适用于简单的 html 页眉和页脚,例如:

<h1>Header Only Line</h1>

<h2>Footer Only Line</h2>

但是我的用例需要在页眉和页脚中添加更复杂的数据,例如图像,所以我尝试使用一个带有指向同一服务器中图像的 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 是这样的:

已编辑:如您所见,它没有显示图像,也没有显示我的结束标记。

我应该怎么做才能成功添加嵌入图像的页眉和页脚?

非常感谢。

P.S:很抱歉给您带来不便,因为我是新来的,希望我的问题很清楚。

编辑:代码,就像在另一个线程中一样:

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

    }

在我的托管 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");

编辑 2:标题应如下所示

如果您是“按原样”谈论 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>

【问题讨论】:

  • 请出示您的代码。
  • 你好@mkl 我已经用我正在使用的代码编辑了我的帖子。非常感谢您的宝贵时间。
  • html header input 的样子,包括图片,就是这样。
  • 你好@mkl,请看我的编辑2。谢谢。

标签: html header itext footer


【解决方案1】:

你在这里画标题:

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>

此标题需要两个段落加上 126 像素 (94.5 pt)。因此,它不适合。因此,只绘制了第一段(这是唯一适合的标题内容)。

您可能希望从允许大量空间开始,例如

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

然后根据你的要求逐步减少。

【讨论】:

  • 你好@mkl,非常感谢,让我看看让你知道,我想我必须首先学习如何使用矩形。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2012-12-18
  • 2011-11-27
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多