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 中仅包含一次图像数据。
我想在我的 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 中仅包含一次图像数据。