我正在使用iTextSharp在ASP.NET C#Windows控制台应用程序中创建PDF文件。
我有一段代码。如果Site是'LMH',我会得到一个很好的PDF,我可以用Adobe Reader打开。如果没有,我收到错误:处理页面时出错。阅读本文档存在问题(114)。
这是我的代码:
string ApplicationPath = System.IO.Directory.GetCurrentDirectory();
PdfPTable table = new PdfPTable(4) { TotalWidth = 800.0F, LockedWidth = true };
float[] widths = new[] { 80.0F, 80.0F, 500.0F, 140.0F };
table.SetWidths(widths);
table.HorizontalAlignment = 0;
table.DefaultCell.Border = 0;
if (ActiveProfile.Site == "LMH")
{
Image hmsImage = Image.GetInstance(ApplicationPath + "\\" + "HMS Logo.png");
hmsImage.ScaleToFit(80.0F, 40.0F);
PdfPCell hmslogo = new PdfPCell(hmsImage);
hmslogo.Border = 0;
hmslogo.FixedHeight = 60;
table.AddCell(hmslogo);
}
else
{
Image blankImage = Image.GetInstance(ApplicationPath + "\\" + "emptyLogo.png");
blankImage.ScaleToFit(80.0F, 40.0F);
PdfPCell emptyCell = new PdfPCell(blankImage);
emptyCell.Border = 0;
emptyCell.FixedHeight = 60;
table.AddCell(emptyCell);
}
主干:
System.IO.FileStream file = new System.IO.FileStream(("C:/") + keyPropertyId + ".pdf", System.IO.FileMode.OpenOrCreate);
Document document = new Document(PageSize.A4.Rotate () , 20, 20, 6, 4);
PdfWriter writer = PdfWriter.GetInstance(document, file );
document.AddTitle(_title);
document.Open();
addHeader(document);
addGeneralInfo(document, keyPropertyId);
addAppliances(document, _LGSRobj);
addFaults(document, _LGSRobj);
addAlarms(document, _LGSRobj);
addFinalCheck(document, _LGSRobj);
addSignatures(document, _LGSRobj);
addFooter(document, writer);
document.Close();
writer .Close ();
file.Close();
所有改变的都是徽标。两个徽标文件都具有相同的尺寸。什么可能是错的? BTW。使用Foxit打开文件很好,但这不是一个可接受的解决方案。
这是我无法用Adobe Reader打开的PDF:https://dl.dropboxusercontent.com/u/20086858/1003443.pdf
这是emptyLogo.png文件:https://dl.dropboxusercontent.com/u/20086858/emptylogo.png
这是有用的徽标:https://dl.dropboxusercontent.com/u/20086858/HMS%20Logo.png
这是pdf的“好”版本,其徽标有效:https://dl.dropboxusercontent.com/u/20086858/1003443-good.pdf
答案 0 :(得分:1)
尽管图像尺寸非常不同,但“好”和“不太好”的版本都具有相同的尺寸,这是非常可疑的。比较它们可以看出两个文件在它们的第一个192993字节中完全不同,但从那里只有很少。此外,损坏的PDF包含此区域中的EOF标记,表示文件在索引140338和192993处结束,但后面的字节看起来不像干净的增量更新。
在第一个表示文件末端140338剪切文件,一个获取OP想要的文件。
因此:
代码用新数据覆盖现有文件;如果前一个文件较长,则该较长文件的剩余部分最后仍为垃圾,因此会导致新文件损坏。
OP打开这样的流:
new System.IO.FileStream(("C:/") + keyPropertyId + ".pdf", System.IO.FileMode.OpenOrCreate);
FileMode.OpenOrCreate
导致观察到的行为。
FileMode
值记录为here on MSDN,尤其是:
因此,请使用
new System.IO.FileStream(("C:/") + keyPropertyId + ".pdf", System.IO.FileMode.Create);
代替。