Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 我如何验证PDF文件是否为;好的;?_Powershell_Itextsharp - Fatal编程技术网

Powershell 我如何验证PDF文件是否为;好的;?

Powershell 我如何验证PDF文件是否为;好的;?,powershell,itextsharp,Powershell,Itextsharp,我有一个压缩PDF文件的过程,我们的秘书通过在多功能打印机上扫描签名文件来创建PDF文件 在极少数情况下,这些文件压缩后无法在Acrobat reader中打开。我不知道为什么这种情况很少发生,所以我希望能够测试PDF后压缩,看看它是否“好” 我正试图使用itextsharp 5.1.1来实现这一点,但它很乐意加载PDF。我最好的猜测是Acrobat reader在试图显示图片时失败了 关于如何判断PDF是否会呈现,有什么想法吗?在过去类似的情况下,我成功地使用以下命令来修复坏的PDF:pdft

我有一个压缩PDF文件的过程,我们的秘书通过在多功能打印机上扫描签名文件来创建PDF文件

在极少数情况下,这些文件压缩后无法在Acrobat reader中打开。我不知道为什么这种情况很少发生,所以我希望能够测试PDF后压缩,看看它是否“好”

我正试图使用itextsharp 5.1.1来实现这一点,但它很乐意加载PDF。我最好的猜测是Acrobat reader在试图显示图片时失败了


关于如何判断PDF是否会呈现,有什么想法吗?

在过去类似的情况下,我成功地使用以下命令来修复坏的PDF:
pdftk break.PDF output fixed.PDF
好的,我最后做的是使用itextsharp循环所有流对象并检查它们的长度。我遇到的错误条件是长度为零。这个测试似乎相当可靠。它可能不适用于所有人,但在这种特殊情况下有效。

我使用了xpdfbin win包和cpdf.exe中的“pdfinfo.exe”来检查PDF文件是否损坏,但如果没有必要,我不想使用二进制文件

我读到较新的PDF格式的末尾有一个可读的xml数据目录,所以我用常规的windows NOTEPAD.exe打开PDF,向下滚动到不可读的数据的末尾,看到几个可读的键。我只需要一个键,但选择同时使用CreationDate和ModDate

以下Powershell(PS)脚本将检查当前目录中的所有PDF文件,并将每个文件的状态输出到文本文件(!RESULTS.log)中。对35000个PDF文件运行此操作大约需要2分钟。我试图为那些新加入PS的人添加评论。希望这能节省一些时间。也许有更好的方法可以做到这一点,但这对我来说是完美无瑕的,并且可以默默地处理错误。您可能需要在开始时定义以下内容:$ErrorActionPreference=“SilentlyContinue”,如果您在屏幕上看到错误

将以下内容复制到文本文件中并适当命名(例如:CheckPDF.ps1)或打开PS并浏览到包含PDF文件的目录,以在控制台中进行检查和粘贴

#
# PowerShell v4.0
#
# Get all PDF files in current directory
#
$items = Get-ChildItem | Where-Object {$_.Extension -eq ".pdf"}

$logFile = "!RESULTS.log"
$badCounter = 0
$goodCounter = 0
$msg = "`n`nProcessing " + $items.count + " files... "
Write-Host -nonewline -foregroundcolor Yellow $msg
foreach ($item in $items)
{
    #
    # Suppress error messages
    #
    trap { Write-Output "Error trapped"; continue; }

    #
    # Read raw PDF data
    #
    $pdfText = Get-Content $item -raw

    #
    # Find string (near end of PDF file), if BAD file, ptr will be undefined or 0
    #
    $ptr1 = $pdfText.IndexOf("CreationDate")
    $ptr2 = $pdfText.IndexOf("ModDate")

    #
    # Grab raw dates from file - will ERR if ptr is undefined or 0
    #
    try { $cDate = $pdfText.SubString($ptr1, 37); $mDate = $pdfText.SubString($ptr2, 31); }

    #
    # Append filename and bad status to logfile and increment a counter
    # catch block is also where you would rename, move, or delete bad files.
    #
    catch { "*** $item is Broken ***" >> $logFile; $badCounter += 1; continue; }

    #
    # Append filename and good status to logfile
    #
    Write-Output "$item - OK" -EA "Stop" >> $logFile

    #
    # Increment a counter
    #
    $goodCounter += 1
}
#
# Calculate total
#
$totalCounter = $badCounter + $goodCounter

#
# Append 3 blank lines to end of logfile
#
1..3 | %{ Write-Output "" >> $logFile }

#
# Append statistics to end of logfile
#
Write-Output "Total: $totalCounter / BAD: $badCounter / GOOD: $goodCounter" >> $logFile
Write-Output "DONE!`n`n"

qpdf将为您的需求提供巨大帮助:

apt-get install qpdf

qpdf --check filename.pdf
示例输出:

checking filename.pdf
PDF Version: 1.4
File is not encrypted
File is not linearized
WARNING: filename.pdf: file is damaged
WARNING: filename.pdf (object 185 0, file position 1235875): expected n n obj
WARNING: filename.pdf: Attempting to reconstruct cross-reference table
WARNING: filename.pdf: object 185 0 not found in file after regenerating cross reference table
operation for Dictionary object attempted on object of wrong type

PdfCpu工作得很好。轻松示例:

pdfcpu validate goggles.pdf
严格的例子:

pdfcpu validate -m strict goggles.pdf

我不知道,但是我可以告诉你一些建议:例如,试着做一些阅读操作怎么样?如果这些读取操作失败,你可能会发现pdf不起作用。如果你是说“读取pdf”,我在最初的问题中提到,我正在使用itextsharp读取Adobe Acrobat中失败的pdf,并且不会产生错误。我在想一些带有“打开文件”的C代码,但在我思考这个问题时,如果它因图像格式错误而崩溃,则只有在运行acrobat reader时才能进行检查。运行小程序/批处理文件/dunno来检查acrobat打开文件后的返回值怎么样?acrobat会弹出一个有错误的对话框。在手动清除之前没有退出代码,即使是在手动清除之后。我真的需要一些东西来测试PDF。我没有任何其他想法:\n你是否尝试直接写入adobe?ewall,在这种情况下,我不需要修复PDF,因为我仍然有好的原件。在这种情况下,我只需要一种可靠的方法来测试PDF。不过,感谢您的建议,因为该工具在许多情况下看起来非常有用。这是有道理的。我想您可以做一些事情,比如运行修复程序,然后将输出文件与原始文件进行比较(通过MD5或SHA-1散列,或者仅仅是文件大小),看看它是否发生了更改?在我使用的一个系统上,我们发现它大约有5%的时间输出一个不好的PDF,所以我们只是通过pdftk修复程序运行所有内容来确定。我想检查我是否在rails应用程序中通过prawn生成了一个有效的PDF,并且检查长度对我也很有效。在我的例子中,无效pdf的长度为1。9年前你在哪里?:-)