J'ai un processus qui comprime les fichiers PDF que nos secrétaires créent en numérisant des documents signés sur une imprimante multifonction. P>
à des occasions rares, ces fichiers ne peuvent pas être ouverts dans Acrobat Reader après avoir été comprimé. Je ne sais pas pourquoi cela se passe rarement, je voudrais donc pouvoir tester la post-compression PDF et voir si elle est "bonne". P>
J'essaie d'utiliser ITEXTSHARP 5.1.1 pour y accomplir, mais cela charge joyeusement le PDF. Ma meilleure estimation est que Acrobat Reader échoue quand il essaie d'afficher la photo. P>
Des idées sur la façon dont je peux dire si le PDF sera rendu? p>
5 Réponses :
Dans des situations similaires dans le passé, j'ai utilisé avec succès le Toolkit PDF (A / k / a pdftk) pour réparer les mauvais pdfs avec une commande comme celle-ci: pdftk bris.pdf sortie.pdf code>. p>.
Ewall, dans ce cas, je n'ai pas besoin de réparer le PDF parce que j'ai toujours le bon original. Dans ce cas, j'ai juste besoin d'un moyen fiable de tester le PDF. Merci de cette suggestion, cependant, parce que cet outil semble très utile dans de nombreuses situations.
Ça a du sens. Je suppose que vous pouvez faire quelque chose comme exécuter le correctif puis comparer le fichier de sortie avec l'original (via MD5 ou SHA-1 hachage, ou simplement la taille du fichier) pour voir si elle est modifiée? Sur un système, j'ai travaillé avec, nous avons découvert que cela produisait un mauvais PDF environ 5% du temps afin que nous ne faisions que tout par le biais du correctif PDFTK pour être sûr.
OK, qu'est-ce que j'ai fini par faire était d'utiliser iTextShaRP pour boucler tous les objets de flux et vérifier leur longueur. La condition d'erreur que j'avais était que la longueur serait zéro. Ce test semble assez fiable. Cela peut ne pas fonctionner pour tout le monde, mais cela a fonctionné dans cette situation particulière. P>
Je voulais vérifier que j'avais généré un PDF valide via la crevette dans une application Rails et la vérification de la longueur a fonctionné pour moi aussi. Dans mon cas, un PDF invalide aurait une longueur de 1.
J'ai utilisé "pdfinfo.exe" à partir du package XPDFBIN-Win and cpdf.exe pour vérifier les fichiers PDF pour la corruption, mais je ne voulais pas impliquer un binaire s'il n'était pas nécessaire.
J'ai lu ça Les nouveaux formats PDF les plus récents ont un catalogue de données XML lisible à la fin. J'ai donc ouvert le PDF avec Windows Notepad.exe régulier et défilé au-delà des données illisibles à la fin et a vu plusieurs clés lisibles. Je n'ai besoin que d'une seule clé, mais j'ai choisi d'utiliser à la fois la créationDate et le moddate. P>
Le script PowerShell (PS) suivant vérifiera tous les fichiers PDF dans le répertoire actuel et sortie l'état de chacun dans un fichier texte ( ! Résultats.log). Il a fallu environ 2 minutes pour courir cela contre 35 000 fichiers PDF. J'ai essayé d'ajouter des commentaires pour ceux qui sont nouveaux à PS. J'espère que cela sauver quelqu'un un peu de temps. Il y a probablement une meilleure façon de le faire, mais cela fonctionne parfaitement à mes fins et gère des erreurs silencieusement. Vous pourriez avoir besoin de définir ce qui suit au début: $ errorActionPreference = "silencieuse" si vous voyez des erreurs à l'écran. P>
Copiez les éléments suivants dans un fichier texte et nommez-le correctement (ex: checkpdf.ps1) ou Ouvrez PS et parcourez le répertoire contenant les fichiers PDF pour vérifier et la coller dans la console. P>
#
# 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 strong> sera d'une grande aide pour vos besoins: exemple de sortie: p>
Où étiez-vous il y a 9 ans? :-)
PDFCPU fonctionne bien. Exemple relaxé: Exemple strict: p>
Je n'ai aucune idée, mais je peux vous dire une suggestion: par exemple, qu'en est-il d'essayer de faire une opération de lecture? Peut-être que si ces opérations de lecture échouent, vous pouvez savoir que le PDF ne fonctionne pas
Si vous voulez dire "lire le PDF", je mentionne dans ma question originale que j'utilise iTextShaRP pour lire le PDF qui échoue à Adobe Acrobat et ne génère aucune erreur.
Je pensais à certains C # Code avec "Open File", mais je pense à cela, si elle se bloque en raison du format de mauvais image, vous ne pouvez vérifier que si vous exécutez le lecteur Acrobat. Qu'en est-il de quelque chose comme un petit programme / fichier de commandes / DUNNO pour vérifier la valeur de retour d'Acrobat après avoir exécuté le fichier?
Acrobat apparaît une boîte de dialogue avec une erreur. Il n'y a pas de code de sortie avant que cela soit effacé manuellement, si même alors. J'ai vraiment besoin de quelque chose pour tester le PDF.
Je n'ai pas d'autres idées: \ Avez-vous essayé d'écrire à Adobe directement?