为什么切换我的徽标会给我一个损坏的PDF文件?

时间:2014-10-23 14:43:55

标签: c# asp.net pdf adobe itextsharp

我正在使用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

1 个答案:

答案 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,尤其是:

  • OpenOrCreate 指定操作系统应该打开文件(如果存在);否则,应创建一个新文件。
  • 创建指定操作系统应创建新文件。如果该文件已存在,则将被覆盖。 ... FileMode.Create等同于请求如果文件不存在,则使用CreateNew;否则,请使用截断。

因此,请使用

new System.IO.FileStream(("C:/") + keyPropertyId + ".pdf", System.IO.FileMode.Create);

代替。