using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocTools.Dtos;
using iTextSharp.text;
using iTextSharp.text.pdf;
using ZetaLongPaths;
namespace DocTools.DBDoc
{
public class PdfDoc : Doc
{
public PdfDoc(DBDto dto, string filter = "html files (.pdf)|*.pdf") : base(dto, filter)
{
}
private static string TTF_Path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TplFile\\pdf\\msyh.ttf");
public override void Build(string filePath)
{
PdfUtils.ExportPdfByITextSharp(filePath, TTF_Path, this.Dto);
}
}
///
/// Pdf处理工具类
///
internal static class PdfUtils
{
///
/// 引用iTextSharp.dll导出pdf数据库字典文档
///
///
///
public static void ExportPdfByITextSharp(string fileName, string fontPath, DBDto dto)
{
var databaseName = dto.DBName;
var tables = dto.Tables;
// 创建并添加文档信息
Document pdfDocument = new Document();
pdfDocument.AddTitle(fileName);
PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument,
new System.IO.FileStream(fileName, System.IO.FileMode.Create));
pdfDocument.Open(); // 打开文档
// 标题
Paragraph title = new Paragraph("数据库字典文档\n\n", BaseFont(fontPath, 30, Font.BOLD));
title.Alignment = Element.ALIGN_CENTER;
pdfDocument.Add(title);
Paragraph subTitle = new Paragraph(" —— " + databaseName, BaseFont(fontPath, 20, Font.NORMAL));
subTitle.Alignment = Element.ALIGN_CENTER;
pdfDocument.Add(subTitle);
// PDF换页
pdfDocument.NewPage();
// 创建添加书签章节
int chapterNum = 1;
// 全局字体设置,处理iTextSharp中文不识别显示问题
Font pdfFont = BaseFont(fontPath, 12, Font.NORMAL);
// log table
Chapter logChapter = new Chapter(new Paragraph(AppConst.LOG_CHAPTER_NAME, pdfFont), chapterNum);
pdfDocument.Add(logChapter);
pdfDocument.Add(new Paragraph("\n", pdfFont)); // 换行
CreateLogTable(pdfDocument, pdfFont, tables);
// PDF换页
pdfDocument.NewPage();
// overview table
Chapter dirChapter = new Chapter(new Paragraph(AppConst.TABLE_CHAPTER_NAME, pdfFont), (++chapterNum));
pdfDocument.Add(dirChapter);
pdfDocument.Add(new Paragraph("\n", pdfFont)); // 换行
CreateOverviewTable(pdfDocument, pdfFont, tables);
// PDF换页
pdfDocument.NewPage();
// table structure
// 添加书签章节
Chapter tableChapter = new Chapter(new Paragraph(AppConst.TABLE_STRUCTURE_CHAPTER_NAME, pdfFont), (++chapterNum));
tableChapter.BookmarkOpen = true;
pdfDocument.Add(tableChapter);
pdfDocument.Add(new Paragraph("\n", pdfFont)); // 换行
foreach (var table in tables)
{
string docTableName = table.TableName + " " + (!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "");
// 添加书签章节
Section selection = tableChapter.AddSection(20f, new Paragraph(docTableName, pdfFont), chapterNum);
pdfDocument.Add(selection);
pdfDocument.Add(new Paragraph("\n", pdfFont)); // 换行
// 遍历数据库表
// 创建表格
PdfPTable pdfTable = null;
if (!table.DBType.StartsWith("Oracle"))
{
pdfTable = new PdfPTable(10);
}
else
{
pdfTable = new PdfPTable(9);
}
// 添加列标题
pdfTable.AddCell(CreatePdfPCell("序号", pdfFont));
pdfTable.AddCell(CreatePdfPCell("列名", pdfFont));
pdfTable.AddCell(CreatePdfPCell("数据类型", pdfFont));
pdfTable.AddCell(CreatePdfPCell("长度", pdfFont));
pdfTable.AddCell(CreatePdfPCell("小数位", pdfFont));
pdfTable.AddCell(CreatePdfPCell("主键", pdfFont));
if (!table.DBType.StartsWith("Oracle"))
{
pdfTable.AddCell(CreatePdfPCell("自增", pdfFont));
}
pdfTable.AddCell(CreatePdfPCell("允许空", pdfFont));
pdfTable.AddCell(CreatePdfPCell("默认值", pdfFont));
pdfTable.AddCell(CreatePdfPCell("列说明", pdfFont));
// 添加数据行,循环数据库表字段
foreach (var column in table.Columns)
{
pdfTable.AddCell(CreatePdfPCell(column.ColumnOrder, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.ColumnName, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.ColumnTypeName, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.Length, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.Scale, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.IsPK, pdfFont));
if (!table.DBType.StartsWith("Oracle"))
{
pdfTable.AddCell(CreatePdfPCell(column.IsIdentity, pdfFont));
}
pdfTable.AddCell(CreatePdfPCell(column.CanNull, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.DefaultVal, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.Comment, pdfFont));
}
// 设置表格居中
pdfTable.HorizontalAlignment = Element.ALIGN_CENTER;
pdfTable.TotalWidth = 520F;
pdfTable.LockedWidth = true;
if (!table.DBType.StartsWith("Oracle"))
{
pdfTable.SetWidths(new float[] { 50F, 60F, 60F, 50F, 50F, 50F, 50F, 50F, 50F, 50F });
}
else
{
pdfTable.SetWidths(new float[] { 50F, 80F, 70F, 50F, 50F, 50F, 50F, 50F, 70F });
}
// 添加表格
pdfDocument.Add(pdfTable);
// PDF换页
pdfDocument.NewPage();
}
if (dto.Views.Count > 0)
{
Chapter viewChapter = new Chapter(new Paragraph("视图", pdfFont), (++chapterNum));
viewChapter.BookmarkOpen = true;
pdfDocument.Add(viewChapter);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
foreach (var item in dto.Views)
{
Section selection = viewChapter.AddSection(20f, new Paragraph(item.Key, pdfFont), chapterNum);
pdfDocument.Add(selection);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
Paragraph pgh = new Paragraph(item.Value.Replace("`", ""), pdfFont);
pdfDocument.Add(pgh);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
}
pdfDocument.NewPage();
}
if (dto.Procs.Count > 0)
{
Chapter procChapter = new Chapter(new Paragraph("存储过程", pdfFont), (++chapterNum));
procChapter.BookmarkOpen = true;
pdfDocument.Add(procChapter);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
foreach (var item in dto.Procs)
{
Section selection = procChapter.AddSection(20f, new Paragraph(item.Key, pdfFont), chapterNum);
pdfDocument.Add(selection);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
Paragraph pgh = new Paragraph(item.Value.Replace("`",""), pdfFont);
pdfDocument.Add(pgh);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
}
pdfDocument.NewPage();
}
// 关闭释放PDF文档资源
pdfDocument.Close();
}
///
/// create log table
///
///
///
///
private static void CreateLogTable(Document pdfDocument, Font pdfFont, List tables)
{
// 创建表格
PdfPTable pdfTable = new PdfPTable(5);
// 添加列标题
pdfTable.AddCell(CreatePdfPCell("版本号", pdfFont));
pdfTable.AddCell(CreatePdfPCell("修订日期", pdfFont));
pdfTable.AddCell(CreatePdfPCell("修订内容", pdfFont));
pdfTable.AddCell(CreatePdfPCell("修订人", pdfFont));
pdfTable.AddCell(CreatePdfPCell("审核人", pdfFont));
for (var i = 0; i < 16; i++)
{
// 添加数据行,循环数据库表字段
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
}
// 设置表格居中
pdfTable.HorizontalAlignment = Element.ALIGN_CENTER;
pdfTable.TotalWidth = 540F;
pdfTable.LockedWidth = true;
pdfTable.SetWidths(new float[] { 80F, 100F, 200F, 80F, 80F });
// 添加表格
pdfDocument.Add(pdfTable);
}
///
/// create overview table
///
///
///
///
private static void CreateOverviewTable(Document pdfDocument, Font pdfFont, List tables)
{
// 创建表格
PdfPTable pdfTable = new PdfPTable(3);
// 添加列标题
pdfTable.AddCell(CreatePdfPCell("序号", pdfFont));
pdfTable.AddCell(CreatePdfPCell("表名", pdfFont));
pdfTable.AddCell(CreatePdfPCell("注释/说明", pdfFont));
foreach (var table in tables)
{
// 添加数据行,循环数据库表字段
pdfTable.AddCell(CreatePdfPCell(table.TableOrder, pdfFont));
pdfTable.AddCell(CreatePdfPCell(table.TableName, pdfFont));
pdfTable.AddCell(CreatePdfPCell((!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : ""), pdfFont));
}
// 设置表格居中
pdfTable.HorizontalAlignment = Element.ALIGN_CENTER;
pdfTable.TotalWidth = 330F;
pdfTable.LockedWidth = true;
pdfTable.SetWidths(new float[] { 60F, 120F, 150F });
// 添加表格
pdfDocument.Add(pdfTable);
}
///
/// 创建pdf表格单元格
///
///
///
///
private static PdfPCell CreatePdfPCell(string text, Font pdfFont)
{
Phrase phrase = new Phrase(text, pdfFont);
PdfPCell pdfPCell = new PdfPCell(phrase);
// 单元格垂直居中显示
pdfPCell.HorizontalAlignment = Element.ALIGN_CENTER;
pdfPCell.VerticalAlignment = Element.ALIGN_MIDDLE;
pdfPCell.MinimumHeight = 30;
return pdfPCell;
}
///
/// iTextSharp字体设置
///
///
///
///
private static Font BaseFont(string fontPath, float fontSize, int fontStyle)
{
BaseFont chinese = iTextSharp.text.pdf.BaseFont.CreateFont(fontPath, iTextSharp.text.pdf.BaseFont.IDENTITY_H, true);
Font pdfFont = new Font(chinese, fontSize, fontStyle);
return pdfFont;
}
}
}