IText:在具有绝对位置的 header 上添加图像

IText : Add an image on a header with an absolute position

我想在我的 PDF 的每一页上放置一个 header。 header 的文本部分已完成,但我找不到放置图片的方法。

public static class Header extends PdfPageEventHelper {             
    public void onEndPage(PdfWriter writer, Document document) {
        try{
            PdfContentByte cb = writer.getDirectContent();      

            /*
              Some code to place my text in the header
            */

            Image imgSoc = Image.getInstance("C:\...\Logo.jpg");
            imgSoc.scaleToFit(110,110);
            imgSoc.setAbsolutePosition(390, 720);

            ColumnText ct = new ColumnText(cb);
            ct.addText(new Chunk(imgSoc,0,0));
            ct.go();

        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

我不太确定我这样做的方式是否正确。

实现此目的的一种方法是将 header 创建为 table:

PdfPTable table = new PdfPTable(1);
Image imgSoc = Image.getInstance("C:\...\Logo.jpg");
imgSoc.scaleToFit(110,110);
PdfPCell cell = new PdfPCell(imgSoc , true);
cell.setBorder(0);
table.addCell(cell);
float[] columnWidths = new float[] { 100};
table.setWidthPercentage(100f);
table.setWidths(columnWidths);
ColumnText ct = new ColumnText(cb);
ct.addElement(table);
ct.setSimpleColumn(36, 0, 559, 806); //Position goes here
ct.go();

您可以这样使用 iText Table,您可以根据用户的选择向左或向右显示徽标。

            Chunk header = new Chunk("your header text", headerFont);
            Image logo = Image.getInstance("../../..");
            // your image path
            logo.scaleAbsolute(80f, 80f);
            logo.scalePercent(100);
            table = new PdfPTable(3);
            table.setWidthPercentage(100);

            PdfPCell detailCell = new PdfPCell(new Phrase(header));
            detailCell.setBorder(Rectangle.NO_BORDER);
            detailCell.setHorizontalAlignment(alignment);
            detailCell.setVerticalAlignment(Element.ALIGN_TOP);

            PdfPCell logoRightCell = new PdfPCell();
            logoRightCell.setFixedHeight(80);
            logoRightCell.setBorder(Rectangle.NO_BORDER);
            logoRightCell.setHorizontalAlignment(Element.ALIGN_RIGHT);

            PdfPCell logoLeftCell = new PdfPCell();
            logoLeftCell.setFixedHeight(80);
            logoLeftCell.setBorder(Rectangle.NO_BORDER);
            logoLeftCell.setHorizontalAlignment(Element.ALIGN_LEFT);

            if (true) {
                String logoAlign = "left";
                if (logoAlign.compareTo("Left") == 0) {
                    logo.setAlignment(Element.ALIGN_LEFT);
                    logoLeftCell.addElement(logo);
                } else {
                    logo.setAlignment(Element.ALIGN_RIGHT);
                    logoRightCell.addElement(logo);
                }
            }
            String headerAlign = "Center";
            if (headerAlign.compareTo("Center") == 0) {
                table.setWidths(new int[] { 2, 7, 2 });
                table.addCell(logoLeftCell);
                table.addCell(detailCell);
                table.addCell(logoRightCell);
            } else if (headerAlign.compareTo("Left") == 0) {
                table.setWidths(new int[] { 7, 2, 2 });
                table.addCell(detailCell);
                table.addCell(logoLeftCell);
                table.addCell(logoRightCell);
            } else {
                table.setWidths(new int[] { 2, 2, 7 });
                table.addCell(logoLeftCell);
                table.addCell(logoRightCell);
                table.addCell(detailCell);
            }

            //
            table.setTotalWidth(document.getPageSize().getWidth()
                    - document.leftMargin() - document.rightMargin());
            table.writeSelectedRows(0, -1, document.leftMargin(), document
                    .getPageSize().getHeight() - document.topMargin() + 20,
                    writer.getDirectContent());
        }
 document.add(table);

已经有两个使用表格的答案。

表格对于创建不同 header 部分(文档标题、文档版本、页码、徽标...)的动态布局非常有帮助。

但是如果您不需要它,已经像 OP 那样准备好了一切,您可以简单地将图像添加到固定位置和固定大小:

public static class Header extends PdfPageEventHelper {             
    public void onEndPage(PdfWriter writer, Document document) {
        try
        {
            PdfContentByte cb = writer.getDirectContent();      

            /*
              Some code to place some text in the header
            */

            Image imgSoc = Image.getInstance("C:\...\Logo.jpg");
            imgSoc.scaleToFit(110,110);
            imgSoc.setAbsolutePosition(390, 720);

            cb.addImage(imgSoc);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

PS:如果你真的在所有页面上使用相同的标志,你最好只将图像文件读入Image实例一次(例如在构造函数或 onOpenDocument) 中,将该实例保存在一个变量中并一次又一次地 re-use 它。这样您就可以在 PDF 中仅包含一次图像数据。