下面我将提供一个完整的解决方案,使用C#将CSV文件内容转换为PDF格式。这个方案使用了iTextSharp库来处理PDF生成,这是.NET生态中常用的PDF处理库之一。
![图片[1]_# 使用C#将CSV数据转换为PDF_知途无界](https://zhituwujie.com/wp-content/uploads/2025/11/d2b5ca33bd20251103085812.png)
准备工作
首先,你需要通过NuGet安装iTextSharp包:
Install-Package itext7
或者使用iTextSharp.LGPLv2.Core(LGPL许可版本):
Install-Package iTextSharp.LGPLv2.Core
完整代码实现
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using iText.Kernel.Colors;
using iText.Kernel.Font;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Borders;
using iText.Layout.Element;
using iText.Layout.Properties;
public class CsvToPdfConverter
{
public void ConvertCsvToPdf(string csvFilePath, string pdfOutputPath)
{
try
{
// 读取CSV文件
var csvData = ReadCsvFile(csvFilePath);
// 创建PDF文档
using (PdfWriter writer = new PdfWriter(pdfOutputPath))
{
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
// 设置页面大小和边距
document.SetMargins(30, 30, 30, 30);
// 添加标题
Paragraph title = new Paragraph(Path.GetFileNameWithoutExtension(csvFilePath))
.SetTextAlignment(TextAlignment.CENTER)
.SetFontSize(18)
.SetBold()
.SetMarginBottom(20);
document.Add(title);
if (csvData == null || csvData.Count == 0)
{
document.Add(new Paragraph("CSV文件为空或无法读取数据").SetFontSize(12));
}
else
{
// 处理CSV数据并添加到PDF
AddCsvDataToPdf(document, csvData);
}
document.Close();
}
Console.WriteLine($"PDF已成功生成: {pdfOutputPath}");
}
catch (Exception ex)
{
Console.WriteLine($"转换过程中发生错误: {ex.Message}");
throw;
}
}
private List<List<string>> ReadCsvFile(string filePath)
{
var data = new List<List<string>>();
try
{
using (var reader = new StreamReader(filePath))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (!string.IsNullOrWhiteSpace(line))
{
// 简单的CSV解析,处理逗号分隔的值
// 注意:对于包含逗号的引用字段,这个简单方法可能不适用
var values = ParseCsvLine(line);
data.Add(values);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"读取CSV文件时出错: {ex.Message}");
return null;
}
return data;
}
private List<string> ParseCsvLine(string line)
{
var values = new List<string>();
bool inQuotes = false;
string current = "";
foreach (char c in line)
{
if (c == '"')
{
inQuotes = !inQuotes;
}
else if (c == ',' && !inQuotes)
{
values.Add(current.Trim());
current = "";
}
else
{
current += c;
}
}
// 添加最后一个字段
values.Add(current.Trim());
return values;
}
private void AddCsvDataToPdf(Document document, List<List<string>> csvData)
{
if (csvData == null || csvData.Count == 0)
return;
// 获取所有可能的列数(处理可能的不规则行)
int maxColumns = 0;
foreach (var row in csvData)
{
if (row.Count > maxColumns)
maxColumns = row.Count;
}
// 创建字体
PdfFont font = PdfFontFactory.CreateFont(iText.IO.Font.Constants.StandardFonts.HELVETICA);
PdfFont boldFont = PdfFontFactory.CreateFont(iText.IO.Font.Constants.StandardFonts.HELVETICA_BOLD);
// 表格将占据页面宽度的100%
float tableWidth = UnitValue.CreatePercentValue(100);
// 创建表格,带有最大列数
Table table = new Table(UnitValue.CreatePercentArray(maxColumns)).UseAllAvailableWidth();
// 设置表格属性
table.SetWidth(tableWidth);
// 添加表头(假设第一行是表头)
if (csvData.Count > 0)
{
var headerRow = csvData[0];
for (int i = 0; i < headerRow.Count; i++)
{
Cell cell = new Cell()
.Add(new Paragraph(headerRow[i]))
.SetFont(boldFont)
.SetBackgroundColor(new DeviceRgb(220, 220, 220)) // 浅灰色背景
.SetTextAlignment(TextAlignment.CENTER)
.SetBorder(new SolidBorder(0.5f));
table.AddCell(cell);
}
// 添加数据行
for (int i = 1; i < csvData.Count; i++)
{
var row = csvData[i];
for (int j = 0; j < row.Count; j++)
{
// 对于空单元格,添加一个空段落以保持表格结构
var cellContent = string.IsNullOrEmpty(row[j]) ? "" : row[j];
Cell cell = new Cell()
.Add(new Paragraph(cellContent))
.SetFont(font)
.SetTextAlignment(GetTextAlignment(j, row.Count))
.SetBorder(new SolidBorder(0.5f));
// 如果是数字,右对齐
if (IsNumeric(cellContent) && j < row.Count - 1) // 假设最后一列通常是文本
{
cell.SetTextAlignment(TextAlignment.RIGHT);
}
table.AddCell(cell);
}
}
}
document.Add(table);
}
private TextAlignment GetTextAlignment(int columnIndex, int totalColumns)
{
// 简单的对齐方式:第一列左对齐,中间列居中,最后一列右对齐
if (columnIndex == 0)
return TextAlignment.LEFT;
else if (columnIndex == totalColumns - 1)
return TextAlignment.RIGHT;
else
return TextAlignment.CENTER;
}
private bool IsNumeric(string value)
{
return double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out _);
}
}
// 使用示例
class Program
{
static void Main(string[] args)
{
var converter = new CsvToPdfConverter();
// 输入CSV文件路径和输出PDF文件路径
string csvFilePath = "data.csv"; // 替换为你的CSV文件路径
string pdfOutputPath = "output.pdf"; // 替换为你想要的PDF输出路径
converter.ConvertCsvToPdf(csvFilePath, pdfOutputPath);
}
}
代码说明
- CsvToPdfConverter类:主类,包含将CSV转换为PDF的核心逻辑。
ConvertCsvToPdf:主方法,协调整个转换过程ReadCsvFile:读取CSV文件内容ParseCsvLine:解析单行CSV数据,处理引号和逗号AddCsvDataToPdf:将CSV数据添加到PDF文档中,以表格形式展示- 辅助方法:处理文本对齐和数字检测
- PDF生成:
- 使用iText 7库创建PDF文档
- 将CSV的第一行作为表格标题
- 自动调整表格列数以适应数据
- 对数字进行右对齐,提高可读性
- 表头使用灰色背景和粗体字突出显示
- 使用示例:
- 在Main方法中指定输入CSV文件和输出PDF文件路径
- 创建转换器实例并调用转换方法
高级选项和改进建议
- 处理复杂CSV:
- 当前实现使用简单的CSV解析器,对于包含转义逗号或换行符的复杂CSV可能不适用
- 可考虑使用专门的CSV解析库,如CsvHelper
- 样式定制:
- 可以添加更多样式选项,如字体大小、颜色、表格边框样式等
- 支持自定义页面大小、页眉页脚
- 分页处理:
- 对于大型CSV文件,可能需要处理分页,确保表格不会被截断
- 性能优化:
- 对于非常大的CSV文件,考虑流式处理和分批写入PDF
- 错误处理:
- 增强错误处理,处理格式错误的CSV行
替代方案
如果你不想使用iText 7,也可以考虑以下替代库:
- PdfSharp:另一个流行的PDF生成库
- QuestPDF:一个现代、声明式的PDF生成库,有免费的个人使用许可
- Syncfusion Essential PDF:商业库,功能强大
希望这个解决方案能帮助你轻松地将CSV数据转换为PDF格式!
© 版权声明
文中内容均来源于公开资料,受限于信息的时效性和复杂性,可能存在误差或遗漏。我们已尽力确保内容的准确性,但对于因信息变更或错误导致的任何后果,本站不承担任何责任。如需引用本文内容,请注明出处并尊重原作者的版权。
THE END

























暂无评论内容