【问题标题】:Read PDF Header using C# or VB.Net使用 C# 或 VB.Net 读取 PDF 标头
【发布时间】:2013-08-25 07:21:30
【问题描述】:

我正在尝试从我的 VB.Net 应用程序中打开一个 PDF 文件。我收到一个错误(弹出窗口)说“文件不以'%PDF-'开头。我想读取文件的标题以确定文件是否已损坏。对现在我正在使用 Windows.Forms.WebBrowser 控件来显示我从数据库加载的 PDF 文件。大多数文件加载正常,但有些已损坏,因此弹出窗口。

这是我用来加载文件的行:webBrw.Navigate(Me.currentDocPath)

如何在 VB.Net 2010 中做到这一点?

【问题讨论】:

  • 您尝试过任何代码吗?

标签: c# vb.net c#-4.0 pdf pdf-generation


【解决方案1】:

来自 PDF 规范。

PDF 文件的第一行应该是由 5 个字符组成的标题 %PDF– 后跟 1.N 形式的版本号,其中 N 是 0 到 7 之间的数字。

听起来您的文件实际上不是有效的 pdf 文件。这将是我仔细检查的第一件事。我曾经从供应商那里获取实际上不是有效 XML 文件的 XML 文件,所以 XML 解析器抛出了一个异常——供应商拒绝解决这个问题让我感到惊讶,因为如果文件中止是 XML 解析器应该做的事情无效。我最终的解决方案是编写一个更正无效 XML 的预解析器,然后调用标准解析器。

我建议尝试使用 PDF 验证工具,http://www.pdf-tools.com/pdf/validate-pdfa-online.aspx 是一个示例,请尝试 How can I test a PDF document if it is PDF/A compliant? 了解更多信息,Adobe 预检(与专业版捆绑在一起)可以验证很多东西,而不仅仅是技术上的 PDF 文件。

【讨论】:

  • 正是这样做的,它奏效了。感谢您的回复
【解决方案2】:

我发现如果你用流式阅读器阅读文件,并且你阅读了第一行,你可以检查它是否包含 %PDF 标题标签,如下所示:

 Dim stream As New StreamReader("C:\Users\dbermudez\Desktop\docBOLR_0.pdf")
 Dim containsPDFHeader As Boolean = True

 If Not stream.ReadLine().Contains("%PDF") Then
     containsPDFHeader = False
 End If

【讨论】:

    【解决方案3】:

    如果您直接访问“错误”文件,您能否打开它们?我之前遇到过这样的错误,这是客户端 Adob​​e 阅读器的问题。某些版本的阅读器不喜欢某些版本的作者创建的文件。我们能够通过将客户的阅读器升级到解决我们的问题的最新版本来解决这个问题。

    我还有一个项目需要更新 PDF 文件中的文本。我发现 .Net 无法直接执行此操作,因此我不得不依赖单独的库。为了测试文件,您可以使用库顶部在 try/catch 块中打开文件。如果加载失败,则说明文件可能已损坏。

    希望这会有所帮助。

    【讨论】:

    • 我注意到的是,根据用于创建 PDF 的组件,版本和格式会有所不同,但总会有一个以 %PDF 开头的标题
    • 对我们来说问题是所有文件都有 %PDF 但这只是版本的一个奇怪问题。您是否检查过“坏”文件以查看它们是否缺少此标头?
    • 确实如此。 “坏”版本不包含标题。
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2014-06-15
    • 2011-06-17
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多