使用iTextSharp生成PDF时损坏文件



我正试图从我的程序中保存一个pdf文件,正如你在我的代码中看到的那样。

private void btnExport_Click(object sender, EventArgs e)
{
if (dgvWord.Rows.Count > 0)
{
SaveFileDialog save = new SaveFileDialog();
save.Filter = " PDF (*.pdf)|*.pdf";
save.FileName = "Result.pdf";
bool ErrorMessage = false;
if (save.ShowDialog() == DialogResult.OK)
{
if (File.Exists(save.FileName))
{
try
{
File.Delete(save.FileName);
}
catch(Exception ex)
{
ErrorMessage = true;
MessageBox.Show("Can't write the data" + ex.Message);
}
}
if (!ErrorMessage)
{
try
{
PdfPTable pTable = new PdfPTable(dgvWord.Columns.Count);
pTable.DefaultCell.Padding = 2;
pTable.WidthPercentage = 100;
pTable.HorizontalAlignment = iTextSharp.text.Element.ALIGN_LEFT;
foreach(DataGridViewRow viewRow in dgvWord.Rows)
{
foreach(DataGridViewCell dcell in viewRow.Cells)
{
pTable.AddCell(dcell.Value.ToString());
}
}
using (FileStream fileStream = new FileStream(save.FileName,FileMode.Create))
{
iTextSharp.text.Document document = new iTextSharp.text.Document(PageSize.A4, 8f, 16f, 16f, 8f);
document.Open();
document.Add(pTable);
document.Close();
fileStream.Close();
}
MessageBox.Show("Data Export success"); 
}
catch(Exception ex)
{
MessageBox.Show("Error while exporting data" + ex.Message);
}
}
}
}
else
{
MessageBox.Show("No record");
}
}

这段代码用于显示我的sql数据库中的数据的按钮。

private void btnShow_Click(object sender, EventArgs e)
{
using (SqlConnection sqcon = new SqlConnection(connectionString))
{
sqcon.Open();
SqlDataAdapter sqdata = new SqlDataAdapter("SELECT * FROM Data", sqcon);
DataTable dt = new DataTable();
sqdata.Fill(dt);
dgvWord.DataSource = dt;
}
}

我可以保存文件,我可以从保存文件的目录中看到它,但我不能将其作为pdf文件打开。错误是文件未正确解码。你能帮我弄清楚我哪里错了吗?

您实际上并没有将PDF内容写入文件。iTextSharp要求您使用PdfWriter.GetInstance将文档附加到fileStream。

using (var fileStream = new FileStream(save.FileName,FileMode.Create))
{
var document = new Document(PageSize.A4, 8f, 16f, 16f, 8f);
document.Open();
// !!make sure the document can be written to the filestream
PdfWriter writer = PdfWriter.GetInstance(document, fileStream);

document.Add(pTable);
document.Close();
writer.Close(); // <- close the writer
fileStream.Close();
}

这是我应该用来生成PDF:的代码

// create document
FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None);
Document doc = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.GetInstance(doc, fs);
// open document
doc.Open();
try
{
// For text and other options
ColumnText ct = new ColumnText(writer.DirectContent);
PdfContentByte cb = writer.DirectContent;
//
//Write you code here
//
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}

// close document
doc.Close();

我认为最好将您的代码放入try-catch中,以防止出现任何错误。

最新更新