参考链接
https://blog.csdn.net/aihan44413/article/details/101174948
效果图

添加依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId >
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
java示例
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.commons.lang3.StringUtils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.;
import java.util.;
import java.util.List;
/**
- 生成数据库设计文档-PDF
*/
public class GenerateTablePdf {
/**
* 字体
*
*/
private static Font FONT;
/**
* 键类型字典
*
*/
private static Map<String,String> KEY_TYPE = new HashMap<>();
/**
* 数据库连接url
*
*/
private static String URL = "***";
/**
* 数据库连接-用户名
*
*/
private static String USER_NAME = "***";
/**
* 数据库连接-密码
*
*/
private static String PASSWORD = "***";
/**
* 数据库查询所有表SQL
*
*/
private static String SQL_GET_ALL_TABLES = "select a.TABLE_NAME,b.COMMENTS from user_tables a,user_tab_comments b WHERE a.TABLE_NAME=b.TABLE_NAME order by TABLE_NAME";
/**
* 数据库查询表所有字段SQL
*
*/
private static String SQL_GET_ALL_COLUMNS = "select T1.column_name,T1.data_type,T1.data_length,t2.comments,T1.NULLABLE,(select max(constraint_type) from user_constraints x left join user_cons_columns y on x.constraint_name=y.constraint_name where x.table_name=t1.TABLE_NAME and y.COLUMN_NAME=T1.column_name) from user_tab_cols t1, user_col_comments t2, user_tab_comments t3 where t1.TABLE_NAME=t2.table_name(+) and t1.COLUMN_NAME=t2.column_name(+) and t1.TABLE_NAME=t3.table_name(+) and t1.TABLE_NAME='{table_name}' order by T1.COLUMN_ID ";
// 初始化jdbc
static{
// 使用iTextAsian.jar包中的字体
try {
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
FONT = new Font(baseFont);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
KEY_TYPE.put("P", "主键");
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
export("F:\\数据库设计.pdf");
}
/**
* 导出表字段属性
*
*/
public static void export(String filePath) throws Exception {
//初始化word文档
Document document = new Document(PageSize.A4);
PdfWriter.getInstance(document , new FileOutputStream(filePath));
document.open();
//查询开始
Connection conn = getConnection();
//获取所有表
List tables = getDataBySQL(SQL_GET_ALL_TABLES,conn);
int i=1;
for (Iterator iterator = tables.iterator(); iterator.hasNext();) {
String [] arr = (String []) iterator.next();
// 循环获取字段信息
System.out.print(i+".正在处理数据表-----------"+arr[0]);
List columns = getDataBySQL(SQL_GET_ALL_COLUMNS.replace("{table_name}", arr[0]),conn);
addTableDetail(arr[0], document,columns);
addBlank(document);
System.out.println("...done");
i++;
}
document.close();
conn.close();
}
/**
* 添加空行
*
*/
public static void addBlank(Document document)throws Exception{
document.add(new Paragraph("\n\n\n\n\n\n"));
}
/**
* 添加包含字段详细信息的表格
*/
public static void addTableDetail(String tableName, Document document,List columns)throws Exception{
PdfPTable table = new PdfPTable(7);
//表格的占比
table.setWidthPercentage(100f);
// 第一行
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(baseFont);
font.setColor(BaseColor.BLACK);
String title;
String comments = ((String[]) columns.iterator().next())[3];
if (StringUtils.isBlank(comments)){
title = tableName;
}else {
comments = comments.replace("id", "");
comments = comments.contains("表") ? comments : comments + "表";
title = tableName + "-" + comments;
}
PdfPCell head = new PdfPCell(new Paragraph(title, FONT));// 单元格
head.setColspan(7);
head.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
head.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
head.setBackgroundColor(BaseColor.GRAY);
table.addCell(head);
// 第二行
PdfPCell cell1 = new PdfPCell(new Paragraph("序号", FONT));// 单元格
PdfPCell cell2 = new PdfPCell(new Paragraph("列名", FONT));// 单元格
PdfPCell cell3 = new PdfPCell(new Paragraph("类型", FONT));// 单元格
PdfPCell cell4 = new PdfPCell(new Paragraph("长度", FONT));// 单元格
PdfPCell cell5 = new PdfPCell(new Paragraph("键", FONT));// 单元格
PdfPCell cell6 = new PdfPCell(new Paragraph("非空", FONT));// 单元格
PdfPCell cell7 = new PdfPCell(new Paragraph("说明", FONT));// 单元格
cell1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
cell2.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
cell3.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
cell4.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
cell5.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
cell6.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
cell7.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
cell1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell2.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell3.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell4.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell6.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell7.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
table.addCell(cell1);
table.addCell(cell2);
table.addCell(cell3);
table.addCell(cell4);
table.addCell(cell5);
table.addCell(cell6);
table.addCell(cell7);
// 主题内容
int x = 1;
for (Iterator iterator = columns.iterator(); iterator.hasNext();) {
String [] arr2 = (String []) iterator.next();
PdfPCell c1 = new PdfPCell(new Paragraph(x+"", FONT));
PdfPCell c2 = new PdfPCell(new Paragraph(arr2[0], FONT));
PdfPCell c3 = new PdfPCell(new Paragraph(arr2[1], FONT));
PdfPCell c4 = new PdfPCell(new Paragraph(arr2[2], FONT));
PdfPCell c5 = new PdfPCell(new Paragraph(KEY_TYPE.getOrDefault(arr2[5], ""), FONT));
PdfPCell c6 = new PdfPCell(new Paragraph("Y".equals(arr2[4])?"否":"是", FONT));
PdfPCell c7 = new PdfPCell(new Paragraph(arr2[3], FONT));
c1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
c2.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
c3.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
c4.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
c5.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
c6.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
c7.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
c1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
c2.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
c3.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
c4.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
c5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
c6.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
c7.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
table.addCell(c1);
table.addCell(c2);
table.addCell(c3);
table.addCell(c4);
table.addCell(c5);
table.addCell(c6);
table.addCell(c7);
x++;
}
document.add(table);
}
/**
* 把SQL语句查询出列表
*/
public static List getDataBySQL(String sql,Connection conn){
Statement stmt = null;
ResultSet rs = null;
List list = new ArrayList();
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
String [] arr = new String[rs.getMetaData().getColumnCount()];
for(int i=0;i<arr.length;i++){
arr[i] = rs.getString(i+1);
}
list.add(arr);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
/**
* 获取数据库连接
*/
public static Connection getConnection(){
try {
return DriverManager.getConnection(URL, USER_NAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
博客提供了生成数据库设计文档PDF的Java示例。包含参考链接,展示了效果图,给出添加依赖的说明,还呈现了Java代码示例,涉及多个相关类的导入及一个生成PDF的类定义。
366

被折叠的 条评论
为什么被折叠?



