我尝试使用以下程序创建报告。事情很好但我无法集中标题"车辆可用性列表(VAL)截至2014年11月5日"
我希望将标题居中,并希望它周围的间距...理想情况下,它应该跨越5列,中心和粗体..
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPCellEvent;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPTableEvent;
import com.itextpdf.text.pdf.PdfWriter;
/**
* First iText example: Hello World.
*/
public class HelloWorld implements PdfPCellEvent, PdfPTableEvent{
/** Path to the resulting PDF file. */
public static final String RESULT
= "c:/itext/hello.pdf";
/**
* Creates a PDF file: hello.pdf
* @param args no arguments needed
*/
public static void main(String[] args)
throws DocumentException, IOException {
new HelloWorld().createPdf(RESULT);
}
/**
* Creates a PDF document.
* @param filename the path to the new PDF document
* @throws DocumentException
* @throws IOException
*/
public void createPdf(String filename)
throws DocumentException, IOException {
// step 1
Document document = new Document();
// step 2
PdfWriter.getInstance(document, new FileOutputStream(filename));
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
// step 3
document.open();
// step 4
document.add(getheaderTable(writer));
document.add(getTable());
// step 5
document.close();
}
public PdfPTable getheaderTable(PdfWriter writer) throws DocumentException, IOException{
HelloWorld gp = new HelloWorld();
PdfPTable headertable = new PdfPTable(new float[] { 5 });
headertable.setTableEvent(gp);
headertable.setWidthPercentage(100f);
headertable.getDefaultCell().setCellEvent(new HelloWorld());
PdfPCell cell = new PdfPCell(new Phrase("VEHICLE AVAILABILITY LISTING (VAL) AS OF 11/05/2014"));
cell.setColspan(5);
cell.setRowspan(5);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
headertable.addCell(cell);
return headertable;
}
public PdfPTable getTable() throws DocumentException, IOException {
HelloWorld gp = new HelloWorld();
PdfPTable table = new PdfPTable(new float[] { 5, 1, 1, 1});
table.setTableEvent(gp);
table.setWidthPercentage(100f);
table.getDefaultCell().setPadding(5);
table.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
table.getDefaultCell().setCellEvent(gp);
for (int i = 0; i < 1; i++) {
table.addCell("CARS");
table.addCell("MODEL");
table.addCell("OPENDATE");
table.addCell("CLOSEOUT DATE");
}
table.getDefaultCell().setBackgroundColor(null);
//table.setHeaderRows(1);
//table.setFooterRows(1);
List<Car> cars = new ArrayList<Car>();
java.util.Date date= new java.util.Date();
System.out.println(new Timestamp(date.getTime()));
Car c = new Car("SUV 4 * 4", "FORD ENDEAVOR",new Timestamp(date.getTime()),new Timestamp(date.getTime()));
System.out.println(c);
cars.add(c);
cars.add(new Car("TRUCK 4 * 4", "GM CHEVY",new Timestamp(date.getTime()),new Timestamp(date.getTime())));
for (Car car : cars) {
table.addCell(car.getItemDesc());
table.addCell(car.getModel());
table.addCell(new SimpleDateFormat("MM/dd/yyyy").format(car.getOpen_Date()));
table.addCell(new SimpleDateFormat("MM/dd/yyyy").format(car.getCloseout_Date()));
}
return table;
}
public void cellLayout(PdfPCell cell, Rectangle position,
PdfContentByte[] canvases) {
float x1 = position.getLeft() + 2;
float x2 = position.getRight() - 2;
float y1 = position.getTop() - 2;
float y2 = position.getBottom() + 2;
PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
canvas.rectangle(x1, y1, x2 - x1, y2 - y1);
canvas.stroke();
}
public void tableLayout(PdfPTable table, float[][] width, float[] height,
int headerRows, int rowStart, PdfContentByte[] canvas) {
float widths[] = width[0];
float x1 = widths[0];
float x2 = widths[widths.length - 1];
float y1 = height[0];
float y2 = height[height.length - 1];
PdfContentByte cb = canvas[PdfPTable.LINECANVAS];
cb.rectangle(x1, y1, x2 - x1, y2 - y1);
cb.stroke();
cb.resetRGBColorStroke();
}
}
class Car{
protected String ItemDesc;
protected String Model;
protected Timestamp Open_Date;
protected Timestamp Closeout_Date;
public Car(String ItemDesc, String Model,Timestamp Open_Date, Timestamp Closeout_Date){
this.ItemDesc = ItemDesc;
this.Model = Model;
this.Open_Date = Open_Date;
this.Closeout_Date = Closeout_Date;
}
public String getItemDesc() {
return ItemDesc;
}
public void setItemDesc(String itemDesc) {
ItemDesc = itemDesc;
}
public String getModel() {
return Model;
}
public void setModel(String model) {
Model = model;
}
public Timestamp getOpen_Date() {
return Open_Date;
}
public void setOpen_Date(Timestamp open_Date) {
Open_Date = open_Date;
}
public Timestamp getCloseout_Date() {
return Closeout_Date;
}
public void setCloseout_Date(Timestamp closeout_Date) {
Closeout_Date = closeout_Date;
}
}
答案 0 :(得分:1)
您似乎错过了对cell.setHorizontalAlignment( Element.ALIGN_CENTER);
您也可以使用cell.setColspan(5);
答案 1 :(得分:0)
问题1:您希望将文本水平放置在单元格(使用文本模式)中。
使用以下方式完成:
cell.setHorizontalAlignment( Element.ALIGN_CENTER);
请注意,在 compostie mode 中使用单元格时,将忽略此属性(水平对齐)。在复合模式中,忽略在单元格级别定义的水平对齐,以支持添加到该单元格的各个元素级别的对齐。
问题2:您希望文本以粗体显示。
目前,您正在创建Phrase
,如下所示:
Phrase phrase = new Phrase("VEHICLE AVAILABILITY LISTING (VAL) AS OF 11/05/2014");
这将创建一个带有Helvetica字体(常规)的文本元素。要使用粗体字体,您需要:
Font bold = new Font(FontFamily.HELVETICA, 12, Font.BOLD);
Phrase phrase = new Phrase("VEHICLE AVAILABILITY LISTING (VAL) AS OF 11/05/2014", bold);
问题3:您希望特定单元格具有最小高度。
目前,您正在创建一个包含5列的表。第一行由具有colspan 5的单个单元组成。因此,该单元跨越整个行。您为此单元格定义了行数为5的行。这太荒谬了。在HTML中试试这个,看看会发生什么。行的高度不受影响(原因很明显)。请从代码中删除以下行(因为它没有意义):
cell.setRowspan(5);
假设您使用的是大小为12的字体,则默认情况下该行的高度为18。你想要一个大约5行的高度,所以你需要90并且让我们添加一些填充并使用高度为100.在这种情况下,你应该添加以下行:
cell.setMinimumHeight(100);
奖金问题:
您可能会遇到文字没有完全垂直居中。这是因为iText做出的一些假设。有时,如果您告诉单元格考虑某些特定的字体指标,例如字体的Ascent和Descent,它会有所帮助:
cell.setUseAscender(真); cell.setUseDescender(真);