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

时间:2016-01-27 10:55:17

标签: java image pdf itext

我想在PDF的每个页面上放置一个标题。 标题的文本部分已完成,但我无法找到放置图像的方法。

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

我不确定我是否正确地做到了这一点。

3 个答案:

答案 0 :(得分:2)

实现此目的的一种方法是将标题创建为表格:

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

答案 1 :(得分:2)

使用表格已有两个答案。

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

但是如果你不需要它,已经拥有像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实例一次(例如在构造函数或{{1}中) }),将该实例保存在变量中并一次又一次地重复使用它。这样,您只能在PDF中包含一次图像数据。

答案 2 :(得分:1)

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

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