Kiq*_*net 20 c# pdf corrupt header file
我有一个Windows应用程序.NET管理许多PDF文件.有些文件已损坏.
2个问题:我会用最糟糕的英语解释...对不起
1.)
如何检测pdf文件是否正确?
我想读PDF的标题和检测是正确的.
var okPDF = PDFCorrect(@"C:\ temp\pdfile1.pdf");
2.)
如何知道文件的byte [](bytearray)是否是PDF文件.
例如,对于ZIP文件,您可以检查前四个字节并查看它们是否与本地标头签名匹配,即以十六进制表示
50 4b 03 04
if(buffer [0] == 0x50 && buffer [1] == 0x4b && buffer [2] == 0x03 && buffer [3] == 0x04)
如果要将其加载到long中,则为(0x04034b50).作者:David Pierson
我希望PDF文件也一样.
byte [] dataPDF = ...
var okPDF = PDFCorrect(dataPDF);
.NET中的任何示例源代码?
Kiq*_*net 35
我检查Header PDF是这样的:
public bool IsPDFHeader(string fileName)
{
byte[] buffer = null;
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
long numBytes = new FileInfo(fileName).Length;
//buffer = br.ReadBytes((int)numBytes);
buffer = br.ReadBytes(5);
var enc = new ASCIIEncoding();
var header = enc.GetString(buffer);
//%PDF?1.0
// If you are loading it into a long, this is (0x04034b50).
if (buffer[0] == 0x25 && buffer[1] == 0x50
&& buffer[2] == 0x44 && buffer[3] == 0x46)
{
return header.StartsWith("%PDF-");
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
Vit*_*aev 18
1)遗憾的是,没有简单的方法来确定pdf文件是否已损坏.通常问题文件具有正确的标题,因此腐败的真正原因是不同的.PDF文件实际上是PDF对象的转储.该文件包含一个引用表,给出了从文件开头起每个对象的确切字节偏移位置.所以很可能损坏的文件有一个破坏的偏移或可能是一些对象被遗漏.
确定文件已损坏的最佳方法是使用专用的PDF库.这些.NET的免费版和商业版都有很多.您可以尝试使用其中一个库加载PDF文件.iTextSharp将是一个不错的选择.
2)根据PDF参考文献,PDF文件的标题通常形成%PDF-1.X(其中X是数字,目前从0到7).99%的PDF文件都有这样的标题.但是还有一些其他类型的标题,Acrobat Viewer接受,甚至没有标题也不是PDF查看器的真正问题.因此,如果文件没有标题,则不应将文件视为已损坏.例如,标题可能出现在文件的前1024个字节内的某个位置,或者格式为%!PS-Adobe-Nn PDF-Mm
仅供参考,我是Docotic PDF库的开发人员.
表现良好的PDF %PDF-1.x
从前9个字节开始加上换行符(其中x在0..8中).1.x
应该给你PDF文件格式的版本.第二行是一些二进制字节,以帮助应用程序(编辑者)将PDF标识为非ASCII文本文件类型.
但是,你完全不能相信这个标签.有很多应用程序使用PDF-1.7中的功能,但声称是PDF-1.4,因此误导了一些观众吐出无效的错误消息.(最喜欢这些PDF是由于文件从较高版本到较低版本的错误管理转换而导致的.)
在PDF中没有像"标题"这样的部分(也许最初的9字节%PDF-1.x
是你用"标题"的意思?).可能嵌入了一个用于在PDF中保存元数据的结构,为您提供有关Author,CreationDate,ModDate,Title和其他一些内容的信息.
除了呈现PDF之外,没有其他方法可以检查PDF的有效性和未损坏性.
对我个人来说,检查这种有效性的"便宜"且相当可靠的方法是使用Ghostscript.
但是:您希望这种情况能够快速自动地发生.并且您希望以编程方式或通过脚本方法使用该方法来检查许多PDF.
这是诀窍:
nullpage
设备.这是一个示例命令行:
gswin32c.exe ^
-o nul ^
-sDEVICE=nullpage ^
-r36x36 ^
"c:/path to /input.pdf"
Run Code Online (Sandbox Code Playgroud)
此示例适用于Windows; 在Unix上使用gs
而不是gswin32c.exe
和-o /dev/null
.
使用-o nul -sDEVICE=nullpage
不会输出任何渲染结果.但是Ghostscript处理input.pdf的所有stderr和stdout输出仍会出现在你的控制台中.-r36x36
将分辨率设置为36 dpi以加快检查速度.
%errorlevel%
(或$?
在Linux上)将0
用于未损坏的文件.它不适0
用于损坏的文件.并且stdout上出现的任何警告或错误消息都可以帮助您识别input.pdf的问题.
没有其他方法来检查PDF文件的损坏,而不是以某种方式呈现它...
更新:同时不仅%PDF-1.0,%PDF-1.1,%PDF-1.2,%PDF-1.3,%PDF-1.4,%PDF-1.5,%PDF-1.6,%PDF-1.7和%PDF-1.8都是有效的版本指标,还有%PDF-2.0.
归档时间: |
|
查看次数: |
41987 次 |
最近记录: |