【问题标题】:How to add Header and footer to my PDF using Itext in java如何在Java中使用Itext将页眉和页脚添加到我的PDF
【发布时间】:2013-11-20 07:36:21
【问题描述】:

我想在我的 PDF 文件中添加页眉图像和页码作为页脚。如何使用 Itext 在我的 PDF 文件中添加页眉和页脚?

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

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Header;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
new Demo().createPDF();
}
public void createPDF(){
Document document = new Document (PageSize.A4);
try {
PdfWriter.getInstance(document, new FileOutputStream("C:/Documents and Settings/mnavya/Desktop/AddImage.pdf"));
document.open ();
document.addCreator("Binod by Demo.java");
document.addAuthor("Binod Suman");
document.addTitle("First PDF By Binod");
Image image = Image.getInstance("https://snaplogic-h.s3.amazonaws.com/uploads/partner/logo/24/stratappa.jpg?u=1382443264");
image.scaleAbsolute(50,50);
document.add(image);

Paragraph paragraph = new Paragraph(
        " Factors",new Font(Font.FontFamily.HELVETICA, 25));
document.add(paragraph);
document.add(Chunk.SPACETABBING);

PdfPTable table = new PdfPTable(8);
table.setWidthPercentage(100);
float[] columnWidths = new float[] { 7, 20, 9, 9, 9, 9, 5, 3 };
table.setWidths(columnWidths);

PdfPCell cell = new PdfPCell();
cell.setColspan(8);
cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
table.addCell(cell);
table.addCell(" ");
table.addCell(" ");
table.addCell("");
table.addCell("");
table.addCell("%");
table.addCell("");
table.addCell(" ");
table.addCell(" ");
document.add(table);
document.close ();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
System.out.println("******** PDF Created ***************");
}
}

【问题讨论】:

标签: java itext


【解决方案1】:

在 StackOverflow 上发布问题之前,请查看 the official iText documentation。更具体地说:查看关键字 header / footer 的示例。

您将找到创建 PDF with a header that has page numbers 第 1 / 39 页、第 2 / 39 页等的 MovieCountries1 示例。

以这个例子为灵感。如果您不需要 Page X of Y 页眉(或页脚)。您可以使用更简单的示例,例如How to add Header and Footer in dynamic pdf using iTextLibrary? 的答案中的示例(这也受到了我书中的一个示例的启发)。

【讨论】:

【解决方案2】:
 HeaderFooter event = new HeaderFooter();
  writer.setBoxSize("art", new Rectangle(36, 54, 559, 788));
  writer.setPageEvent(event);

document itxt

ejemplo example of PDF

【讨论】:

    【解决方案3】:

    页脚页眉工具:

    import com.itextpdf.text.Document;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Phrase;
    import com.itextpdf.text.pdf.ColumnText;
    import com.itextpdf.text.pdf.PdfPageEventHelper;
    import com.itextpdf.text.pdf.PdfWriter;
    
    public class HeaderFooterPageEvent extends PdfPageEventHelper {
    
        public void onStartPage(PdfWriter writer, Document document) {
            ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Top Left"), 30, 800, 0);
            ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Top Right"), 550, 800, 0);
        }
    
        public void onEndPage(PdfWriter writer, Document document) {
            ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("http://www.xxxx-your_example.com/"), 110, 30, 0);
            ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("page " + document.getPageNumber()), 550, 30, 0);
        }
    
    }
    

    使用 HeaderFooterPageEvent:

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    Document document = new Document(PageSize.A4, 20, 20, 50, 25);
    PdfWriter writer = PdfWriter.getInstance(document, baos);
    HeaderFooterPageEvent event = new HeaderFooterPageEvent();
    writer.setPageEvent(event);
    

    编辑(添加图片示例):

    public void onStartPage(PdfWriter writer, Document document) {
        String img = APPLICATION_SERVER_ROOT_PATH + File.separator + "assets" + File.separator + "images" + File.separator + "logo-tp-white.png";
        Image image;
        try {
            image = Image.getInstance(img);
            image.setAlignment(Element.ALIGN_RIGHT);
            image.setAbsolutePosition(20, 790);
            image.scalePercent(7.5f, 7.5f);
            writer.getDirectContent().addImage(image, true);
        } catch (IOException | DocumentException e) {
            log.error("L'image logo-tp-50x50.png a provoqué une erreur.", e);
        }
    
        ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(""), 30, 800, 0);
        ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(Constants.GLOBAL_HOST + " pour réussir votre prochain concours."), 400, 800, 0);
    }
    

    【讨论】:

    • 在页眉/页脚上添加图像的任何方式
    • 这也适用于PDFAWriter 还是需要任何更改?我无法将其用于 PDF/A-2
    • @Sumit,我认为是因为PdfAWriter 扩展了PdfWriter (itextsupport.com/apidocs/itext5/5.5.9/com/itextpdf/text/pdf/…)
    • @sgrillon 我收到了与字体未嵌入new Phrase() 相关的异常,有没有办法添加paragraph 或将短语的font 设置为嵌入字体?跨度>
    【解决方案4】:

    我正在使用 iText2。 虽然 PdfPageEventHelper 可以解决,但 HeaderFooter 似乎更容易。 确保在 document.open() 之前添加 HeaderFooter,否则第一页不会显示。

    Document document = new Document(PageSize.A4, MARGIN, MARGIN, MARGIN, MARGIN);
    HeaderFooter footer = new HeaderFooter(new Phrase("- "), new Phrase(" -"));
    footer.setAlignment(Element.ALIGN_CENTER);
    footer.setBorder(Rectangle.NO_BORDER);
    document.setFooter(footer);
    

    【讨论】:

      【解决方案5】:

      这可以帮助您使用itext 添加页眉和页脚:

      public class PageNumber  extends PdfPageEventHelper{
      private PdfTemplate t;
      private Image total;
      
      public void onOpenDocument(PdfWriter writer, Document document) {
          t = writer.getDirectContent().createTemplate(30, 16);
          try {
              total = Image.getInstance(t);
              total.setRole(PdfName.ARTIFACT);
          } catch (DocumentException de) {
              throw new ExceptionConverter(de);
          }
      }
      
      @Override
      public void onEndPage(PdfWriter writer, Document document) {
          addHeader(writer);
          addFooter(writer);
      }
      
      private void addHeader(PdfWriter writer){
          PdfPTable header = new PdfPTable(1);
          try {
              // set defaults
              header.setWidths(new int[]{100});
              header.setTotalWidth(525);
              header.setLockedWidth(true);
              header.getDefaultCell().setFixedHeight(65);
              header.getDefaultCell().setBorder(Rectangle.BOTTOM);
              header.getDefaultCell().setBorderColor(BaseColor.LIGHT_GRAY);
      
              // add image
              Image logo = Image.getInstance(PageNumber.class.getResource("/sample.png"));
              header.addCell(logo);
      
      
              // write content
              header.writeSelectedRows(0, -1, 34, 823, writer.getDirectContent());
          } catch(DocumentException de) {
              throw new ExceptionConverter(de);
          } catch (MalformedURLException e) {
              throw new ExceptionConverter(e);
          } catch (IOException e) {
              throw new ExceptionConverter(e);
          }
      }
      
      
      private void addFooter(PdfWriter writer){
          PdfPTable footer = new PdfPTable(1);
          try {
      
              footer.setWidths(new int[]{100});
              footer.setTotalWidth(527);
              footer.setLockedWidth(false);
              footer.getDefaultCell().setFixedHeight(40);
              footer.getDefaultCell().setBorder(Rectangle.TOP);
              footer.getDefaultCell().setBorderColor(BaseColor.LIGHT_GRAY);
      
              // add current page count
              footer.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT);
              footer.addCell(new Phrase(String.format( writer.getPageNumber()+ " | Page") , new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD)));
      
              // write page
              PdfContentByte canvas = writer.getDirectContent();
              canvas.beginMarkedContentSequence(PdfName.ARTIFACT);
              footer.writeSelectedRows(0, -1, 34, 50, canvas);
              canvas.endMarkedContentSequence();
          } catch(DocumentException de) {
              throw new ExceptionConverter(de);
          }
      }
      
      public void onCloseDocument(PdfWriter writer, Document document) {
          int totalLength = String.valueOf(writer.getPageNumber()).length();
          int totalWidth = totalLength * 5;
          ColumnText.showTextAligned(t, Element.ALIGN_LEFT,
                  new Phrase(String.valueOf(writer.getPageNumber()),new Font(Font.FontFamily.HELVETICA, 12)),
                  totalWidth, 6, 0);
        }
      }
      

      【讨论】:

      • 您的答案基本上使用了与先前已接受的答案相同的技术。你的答案在哪方面超过了那个答案?
      • 是的,你是对的。但我认为,任何关于此的新建议也会对我有所帮助。
      【解决方案6】:
      HeaderFooter header =new HeaderFooter(new Phrase(resources.getMessage("your header")),false);
                      header.setAlignment(HeaderFooter.ALIGN_CENTER);
                      header.setBorder(Rectangle.NO_BORDER);
                      document.setHeader(header);
                      document.open();
      

      【讨论】:

        猜你喜欢
        • 2015-12-05
        • 2013-11-08
        • 2020-04-26
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 2015-06-04
        相关资源
        最近更新 更多