Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

PDF Datei auf Fehler überprüfen

Frage Entwicklung Batch & Shell

Mitglied: pdf-fragender

pdf-fragender (Level 1) - Jetzt verbinden

26.01.2013, aktualisiert 11.03.2016, 8691 Aufrufe, 11 Kommentare

Hallo zusammen,

Bei meiner Arbeit muss ich momentan eine grosse Anzahl von PDF Dateien kontrollieren (mehrere Hunderttausend).
Leider tritt es häufig auf, dass einige gar nicht geöffnet werden können.

Es kommt meist folgender Fehler:

d5896c6dabea538e79be532ed02fa832 - Klicke auf das Bild, um es zu vergrößern

Nun habe ich mir überlegt, die Dateien vorher via Batch zu überprüfen, damit ich diese heraus filtere und somit ungestört weiter Arbeiten kann.
Das ganze muss ich leider über eine Batch Aufgabe lösen, da ich keine Administrationsrechte habe um andere Programme zu installieren.
Die Dateien liegen auf einem Server-Archiv. Dies ist wie folgt aufgebaut (am Ende des Beitrags ein Bild dazu):
Beispiel:
\\archiv01\Archiv\Jahr\Monat\GuteQualität\"hier sind die PDF"

Für jedes Jahr und Monat gibt es einen Ordner. Auch gibt es jeweils einen Ordner mit "SchlechteQualität", dieser wird aber nicht kontrolliert.

Zum besseren Verständnis ein Beispiel:
\\archiv01\Archiv\2011\01\GuteQualität\"hier sind die PDF" <- jeweils um die 180 Stk. 
                         \SchlechteQualität\"nicht kontrollieren" 
                      \02\GuteQualität\"hier sind die PDF" 
                         \SchlechteQualität\"nicht kontrollieren" 
                      \03\GuteQualität\"hier sind die PDF" 
                         \SchlechteQualität\"nicht kontrollieren" 
                      \usw.\GuteQualität\"hier sind die PDF" 
 
\\archiv01\Archiv\2012\01\GuteQualität\"hier sind die PDF" 
                         \SchlechteQualität\"nicht kontrollieren" 
                      \02\GuteQualität\"hier sind die PDF" 
                         \SchlechteQualität\"nicht kontrollieren" 
                      \03\GuteQualität\"hier sind die PDF" 
                         \SchlechteQualität\"nicht kontrollieren" 
                      \usw.\GuteQualität\"hier sind die PDF"

Weiss jemand wie ich dies realisieren könnte. Bzw. wie der Code aussehen müsste. Habe leider nur beschränkte erfahrungen im Batch Scripting.

Das System ist ein Windows XP Computer
Welcher Adobe Reader Version 9.5.2 installiert hat.
Alle Programme sind im Standard Verzeichniss installiert

Hier ein Ausschnitt des Archives:
ba1222d44139c7d39da581964cae5898 - Klicke auf das Bild, um es zu vergrößern

Was ich nun umsetzen möchte, kurz zusammengefasst:
-Ein Batch Script welche jeweils in dass Richtige Verzeichnis geht (könnte die Pfade auch in einer .txt datei hinterlegen)
-Kontrolliert ob kein Fehler beim öffnen entsteht
-Wenn ein Fehler entstehen die Datei in einer .txt auflistet (ganzer Pfad)
-Es dürfen nicht mehr als maximal 6 Stück geöffnet werden, da sonst der Computer Probleme hat (ist eine ältere Kiste)

Bin wirklich dankbar für jede Hilfe.
Es muss jetzt nicht ein fix fertiges Skript geschrieben werden, sondern ich bin schon erfreut und erleichtert wenn dies mit dem Beispiel Archiv funktioniert.
Mitglied: DerWoWusste
26.01.2013 um 18:20 Uhr
Moin.

Vielleicht so, mit zwei Zeilen von der Kommandozeile? Kreiere eine Liste mit allen PDF-Dateien:
dir <Oberordner>\*.pdf /b /s >%temp%\pdfs.txt
Rufe dann alle nacheinander auf - defekte aufzurufen sollte mit einem Errorlevel ungleich Null belegt werden und das wird in eine Datei geloggt, die Du dann zur Verfügung hast.
for /f %a in (%temp%\pdfs.txt) do <Pfad zum Reader> %a & if %errorlevel% NEQ 0 echo %a >>%temp%\defektePDFs.txt
Bitte warten ..
Mitglied: Friemler
27.01.2013, aktualisiert um 23:46 Uhr
Hallo pdf-fragender,

bei dieser Aufgabenstellung gibt es gleich mehrere Probleme:

  1. Der Adobe Reader liefert keinen Exit-Code, der Auskunft darüber gibt, ob ein Dokument geladen werden konnte oder nicht.
  2. Die Dateien liegen auf einer Netzwerkfreigabe und CMD unterstützt nur indirekt mit einem Trick UNC-Pfade.
  3. Wenn das PDF-Dokument defekt ist, erscheint die von Dir schon erwähnte Fehlermeldung, die durch das Script geschlossen werden muss.
  4. Die Zeit, die zum Laden eines PDF-Dokuments benötigt wird, ist davon abhängig
    • wie groß das Dokument ist,
    • welcher PDF-Reader in welcher Version verwendet wird,
    • wie schnell die Daten über das Netzwerk geliefert werden.

Mit dem folgenden Code wird versucht diese Probleme zu lösen:
01.
@echo off & setlocal 
02.
 
03.
::Ausgabedateien 
04.
set "GoodFiles=GoodFiles.txt" 
05.
set "BadFiles=BadFiles.txt" 
06.
 
07.
::Pfad zum Programm WINDOWBUSTER 
08.
set "WindowBuster=<Laufwerk>:\<Pfad>\WindowBuster.exe" 
09.
 
10.
::Auszulassendes Verzeichnis 
11.
set "SkipFolder=SchlechteQualität" 
12.
 
13.
::Name der EXE des PDF-Readers 
14.
set "PDFReaderExe=AcroRd32.exe" 
15.
 
16.
::Fenstertitel der Fehlermeldung beim 
17.
::Öffnen eines beschädigten PDF-Dokuments 
18.
set "PDFErrorTitle=Adobe Reader" 
19.
 
20.
::Beschriftung des Buttons in der Fehlermeldung 
21.
::beim Öffnen eines beschädigten PDF-Dokuments 
22.
set "PDFErrorButton=OK" 
23.
 
24.
::Zeit in Sekunden, die auf den Abschluss des Ladevorgangs 
25.
::für den PDF-Reader und eines PDF-Dokuments gewartet wird 
26.
set "WaitForLoad=3" 
27.
 
28.
::Zeit in Millisekunden, die auf das Erscheinen 
29.
::der Fehlermeldung des PDF-Readers gewartet wird 
30.
set "WaitForError=300" 
31.
 
32.
 
33.
::Netzwerkfreigabe mount 
34.
pushd "%~dp0" 
35.
 
36.
::Für die Erzeugung der Ausgabedateien die Codepage umschalten 
37.
chcp 1252 > NUL 
38.
 
39.
::Alle PDF-Dokumente in allen untergeordneten Verzeichnissen prüfen 
40.
::Dabei jedoch Dateien in einem bestimmtes Verzeichnis nicht prüfen 
41.
(for /f "delims=" %%f in ('dir /s /b /a:-d "*.pdf" 2^>NUL ^| find /i /v "\%SkipFolder%\"') do ( 
42.
   call :CheckFile "%%f" && ( 
43.
     echo %%f 
44.
   ) || ( 
45.
     1>&2 echo %%f 
46.
47.
)) 1>"%GoodFiles%" 2>"%BadFiles%" 
48.
 
49.
::Netzwerkfreigabe unmount 
50.
popd 
51.
 
52.
::Script Ende 
53.
exit /b 
54.
 
55.
 
56.
 
57.
::Unterprogramm 
58.
:CheckFile 
59.
  ::PDF-Dokument mit verknüpftem Programm öffnen 
60.
  start "" "%~1" 
61.
   
62.
  ::Warten bis es geladen wurde 
63.
  ping -n %WaitForLoad% 127.0.0.1 > NUL 
64.
   
65.
  ::Fenster des PDF-Readers mit geladenem Dokument suchen 
66.
  ::Bei erfolgreichem Laden sollte der Dateiname im Fenstertitel auftauchen 
67.
  set /a FileDamaged=1 
68.
   
69.
  for /f "skip=1" %%a in ('tasklist /nh /fi "WINDOWTITLE eq %~nx1*"') do ( 
70.
    if /i "%%a" equ "%PDFReaderExe%" set /a FileDamaged=0 
71.
72.
   
73.
  ::Falls die Datei beschädigt war, die Fehlermeldung wegklicken 
74.
  if %FileDamaged% equ 1 ( 
75.
    "%WindowBuster%" /WindowTitle="%PDFErrorTitle%" /Button="%PDFErrorButton%" /Action="PressButton" /Exact=True /KeepOpen=False /Interval=%WaitForError% /Timeout=500 
76.
77.
 
78.
  ::Den PDF-Reader schließen 
79.
  taskkill /fi "IMAGENAME eq %PDFReaderExe%" > NUL 
80.
exit /b %FileDamaged%
Damit alles funktioniert müssen folgende Voraussetzungen erfüllt werden:

  • Du benötigst das Konsolenprogramm WINDOWBUSTER, damit die Fehlermeldung geschlossen werden kann. Das Programm muss nicht installiert werden. Du musst in Zeile 8 des Scripts einen vollständigen Pfad zum Programm angeben. Das Programm sucht nach einem Fenster, in dessen Titelleiste der Wert aus der Variablen PDFErrorTitle in Zeile 18 steht. In diesem Fenster wird nach einem Button gesucht, der mit dem Wert aus der Variablen PDFErrorButton in Zeile 22 beschriftet ist und ein Klick auf diesen Button simuliert.
  • Das Script muss auf die Netzwerkfreigabe ins Verzeichnis \\archiv01\Archiv kopiert und von dort gestartet werden, sonst kann die Netzwerkfreigabe nicht gemountet werden (im Konsolenfenster ist zwar eine Fehlermeldung zu sehen, die wird aber direkt beim Start von CMD.exe ausgegeben, bevor die Netzwerkfreigabe gemountet wird).
  • Das Script muss in der Codierung OEM850 gespeichert werden (z.B. mit Notepad++), da das auszunehmende Verzeichnis SchlechteQualität ein ä enthält. Auf der Konsole, also auch in Batchscripts, wird die Codepage OEM850 benutzt. Wenn Du mit dem normalen Notepad speicherst, wird die Codierung ANSI bzw. WINDOWS-1252 benutzt, in der das ä einen anderen Code hat. => Die Ausnahme dieses Verzeichnisses würde nicht funktionieren.
  • Die Variable WaitForLoad in Zeile 26 muss evtl. angepasst werden, vor allem wenn Du eine ältere Maschine benutzt, die etwas länger benötigt, um den Adobe Reader und das PDF-Dokument zu laden.
  • Die Variable WaitForError in Zeile 30 muss evtl. angepasst werden, damit bei einem defekten Dokument das Fenster mit der Fehlermeldung von WINDOWBUSTER gefunden wird.
  • [EDIT] Während das Script läuft, darf der verwendete PDF-Reader nicht nocheinmal gestartet werden. Es könnte sonst in Zeile 79 beim Schließen der Reader-Instanz, die im Script für die Prüfung gestartet wird, zu Verwechslungen kommen und die falsche Instanz beendet werden. [/EDIT]

Es werden wahrscheinlich Fehlschläge registriert werden, die keine sind, außer Du stellst für WaitForLoad einen ziemlich großen Wert ein, der bei der großen Menge an Dateien nicht praktikabel ist. Das Script kann nur dabei helfen, die Menge der Dateien zu verringern, die von Hand geprüft werden müssen. Evtl. kannst Du nach einem ersten Durchlauf den Wert für WaitForLoad erhöhen und nur die vorher als defekt erkannten Dateien nochmal prüfen lassen.

Das Script arbeitet durch die Wartezeiten beim Laden der PDF-Dokumente ziemlich langsam (rechne bei 300.000 PDF-Dokumenten mit ca. 2 Wochen). Evtl. wäre eine Möglichkeit der Beschleunigung, eine 9er-Version des Adobe Readers oder einen anderen PDF-Reader zu verwenden, der die Dokumente schneller lädt. Der Name der EXE des PDF-Readers kann in Zeile 14 eingetragen werden. Bedingung für einen anderen Reader ist, dass der Name eines erfolgreich geladenen PDF-Dokuments im Fenstertitel angezeigt wird. Bei einem Fehlschlag darf der Dokumentname nicht angezeigt werden.

Das Script erzeugt zwei Ausgabedateien, eine für die erfolgreich geöffneten Dokumente und eine für die Dokumente, bei denen das Öffnen fehlgeschlagen ist. In den Dateipfaden wird der Laufwerksbuchstabe angegeben, unter dem die Netzwerkfreigabe automatisch gemountet wird. Diese Dateien werden (wegen Zeile 37) in der Codierung Windows-1252 erzeugt, die normale ANSI-Codierung unter einem deutschen Windows. Falls die Dateien von anderen Batchscripts verarbeitet werden sollen, muss in diesen Batchscripts beim Einlesen ebenfalls auf die Codierung Windows-1252 umgeschaltet werden, damit Dateinamen, die die Buchstaben äöüßÄÖÜ oder andere Sonderzeichen enthalten, richtig eingelesen werden. Oder Du kommentierst Zeile 37 aus, wodurch die Dateien in der Codierung OEM850 erstellt werden.

Gruß
Friemler
Bitte warten ..
Mitglied: pdf-fragender
27.01.2013, aktualisiert 06.02.2013
Gibt es evt. auch eine Möglichkeit, dass ganze ohne es ins Archiv Verzeichniss zu kopieren umzusetzen?
Bitte warten ..
Mitglied: bastla
27.01.2013, aktualisiert um 17:19 Uhr
Hallo pdf-fragender und willkommen im Forum!
Gibt es evt. auch eine Möglichkeit, dass ganze ohne es ins Archiv Verzeichniss zu kopieren umzusetzen?
Du könntest versuchsweise die Zeilen 33 bis 50 durch
01.
::Quell-Ordner 
02.
set "Quelle=\\archiv01\Archiv" 
03.
 
04.
::Für die Erzeugung der Ausgabedateien die Codepage umschalten 
05.
chcp 1252 > NUL 
06.
 
07.
::Alle PDF-Dokumente in allen untergeordneten Verzeichnissen prüfen 
08.
::Dabei jedoch Dateien in einem bestimmtes Verzeichnis nicht prüfen 
09.
(for /f "delims=" %%f in ('dir /s /b /a:-d "%Quelle%\*.pdf" 2^>NUL ^| find /i /v "\%SkipFolder%\"') do ( 
10.
   call :CheckFile "%%f" && ( 
11.
     echo %%f 
12.
   ) || ( 
13.
     1>&2 echo %%f 
14.
15.
)) 1>"%GoodFiles%" 2>"%BadFiles%"
ersetzen und in den Zeilen 4 und 5 vollständige Pfade für die Ausgabedateien angeben ...

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
27.01.2013, aktualisiert um 23:24 Uhr
Hallo pdf-fragender und alle die hier mitlesen,

zunächst mal etwas fachchinesisch:

[FACHCHINESISCH]

Ich habe noch ein wenig geforscht und herausgefunden, dass der Adobe Reader eine rudimentäre Scripting-Schnittstelle hat, d.h. man kann ihn über ein Script steuern. Allerdings muss man dazu das ActiveX Control des Browser-Plugins verwenden (das Plugin, durch das man PDF-Dokumente im Browser ansehen kann), d.h. man kann die Programmierschnittstelle nur

  • von einer Webseite aus oder
  • aus einer HTML-Application (*.hta) heraus

ansprechen. Oder man erzeugt per VBScript über die OLE-Schnittstelle des InternetExplorers scriptgesteuert eine IE-Instanz, navigiert nach about:blank (leere Seite) und injiziert über das Document Object Model (DOM) den notwendigen HTML-Code in die Seite, um das Adobe Reader ActiveX Control ansprechen zu können. Man kann dann die Methode LoadFile aufrufen und eine Datei laden. Der Rückgabewert dieser Methode liefert die Information, ob das Dokument erfolgreich geladen werden konnte.

Link zur Doku von Adobe. Dort über das Inhaltsverzeichnis links navigieren nach:

Acrobat Interapplication Communication -> Interapplication Communication API Reference -> OLE Automation -> AxAcroPDFLib.AxAcroPDF

[/FACHCHINESISCH]


Hört sich erstmal gut an. Die Methode hat auch einige Vorteile. Das Script wird dadurch

  • kürzer,
  • zuverlässiger und
  • schneller.

Der Zuwachs an Zuverlässigkeit und Geschwindigkeit kommt dadurch zustande, dass das Script und das Laden der PDF-Dokumente synchron ablaufen, d.h. dann, und genau dann, wenn ein PDF-Dokument fertig geladen ist und die Aussage Erfolg/Fehlschlag gemacht werden kann, läuft das Script weiter. Dadurch wird nur solange gewartet, wie es wirklich notwendig ist, und das Ergebnis der Prüfung ist 100% verlässlich.

So, und jetzt kommen die Nachteile, die besonders für Dich, pdf-fragender, sehr gravierend sind:

  • Das ActiveX Control des Adobe Readers kann keine Netzwerkfreigaben (UNC-Pfade) und
  • keine Netzlaufwerke (als Laufwerk eingebundene Netzwerkfreigaben) ansprechen.

D.h. das untenstehende Script muss auf dem Rechner laufen, auf dem die PDF-Dateien liegen und auf diesem Rechner muss der Adobe Reader installiert werden. Dafür ist es wie gesagt um einiges schneller und zuverlässiger als die andere Version.

Vielleicht kannst Du Deine Admins überzeugen, wenn Du Ihnen erklärst, dass das andere Script mehrere Wochen laufen müsste um alle PDF-Dokumente zu prüfen und dabei auch noch fehlerhafte Ergebnisse auftreten können. Deshalb hier mal der Code, evtl. ist er auch für jemand anderes hilfreich.

01.
@echo off & setlocal 
02.
 
03.
::Quellverzeichnis 
04.
set "SrcFolder=<Laufwerk>:\Pfad\Archiv" 
05.
 
06.
::Auszulassendes Verzeichnis 
07.
set "SkipFolder=SchlechteQualität" 
08.
 
09.
::Ausgabedateien 
10.
set "GoodFiles=GoodFiles.txt" 
11.
set "BadFiles=BadFiles.txt" 
12.
 
13.
::Pfad zu temporärer VBScript-Datei 
14.
set "CheckFile=%TEMP%\CheckPDFDoc.vbs" 
15.
 
16.
 
17.
::Temporäre VBScript-Datei schreiben 
18.
> "%CheckFile%" echo.Set objIE = CreateObject("InternetExplorer.Application") 
19.
>>"%CheckFile%" echo. 
20.
>>"%CheckFile%" echo.objIE.Visible = False 
21.
>>"%CheckFile%" echo.objIE.Navigate("about:blank") 
22.
>>"%CheckFile%" echo. 
23.
>>"%CheckFile%" echo.Do 
24.
>>"%CheckFile%" echo.Loop Until objIE.ReadyState = 4 
25.
>>"%CheckFile%" echo. 
26.
>>"%CheckFile%" echo.objIE.Document.Write "<HTML><BODY><OBJECT classid=""CLSID:CA8A9780-280D-11CF-A24D-444553540000"" id=""AdobeReader""></OBJECT></BODY></HTML>" 
27.
>>"%CheckFile%" echo. 
28.
>>"%CheckFile%" echo.If objIE.Document.All.AdobeReader.LoadFile(WScript.Arguments(0)) Then 
29.
>>"%CheckFile%" echo.  loadResult = 0 
30.
>>"%CheckFile%" echo.Else 
31.
>>"%CheckFile%" echo.  loadResult = 1 
32.
>>"%CheckFile%" echo.End If 
33.
>>"%CheckFile%" echo. 
34.
>>"%CheckFile%" echo.objIE.Quit 
35.
>>"%CheckFile%" echo. 
36.
>>"%CheckFile%" echo.WScript.Quit loadResult 
37.
 
38.
 
39.
::Für die Erzeugung der Ausgabedateien die Codepage umschalten 
40.
chcp 1252 > NUL 
41.
 
42.
::Alle PDF-Dokumente in allen untergeordneten Verzeichnissen prüfen 
43.
::Dabei jedoch Dateien in einem bestimmtes Verzeichnis nicht prüfen 
44.
(for /f "delims=" %%f in ('dir /s /b /a:-d "%SrcFolder%\*.pdf" 2^>NUL ^| find /i /v "\%SkipFolder%\"') do ( 
45.
   cscript /nologo "%CheckFile%" "%%f" && ( 
46.
     echo %%f 
47.
   ) || ( 
48.
     1>&2 echo %%f 
49.
50.
)) 1>"%GoodFiles%" 2>"%BadFiles%" 
51.
 
52.
::Temporäres VBScript löschen 
53.
del "%CheckFile%"
Gruß
Friemler
Bitte warten ..
Mitglied: 76109
28.01.2013, aktualisiert um 11:19 Uhr
Hallo Friemler!

Wobei
01.
If objIE.Document.All.AdobeReader.LoadFile
leider nur funktioniert, wenn z.B. die PDF-Datei nicht gefunden wird. Bei defekten PDF's gibt LoadFile auch True zurück...

Hatte eine ähnliche Idee, allerdings per HTA, was recht schnell geht. Leider habe ich auch keine Idee wie ein Lade-Fehler ausgewertet werden soll.

Der vollständigkeit halber der HTA-Code:
01.
<html> 
02.
  <head> 
03.
    <title>PDF Test</title> 
04.
    <hta:application id="App" scroll="no" windowstate="minimize"> 
05.
  </head> 
06.
  <body> 
07.
    <object classid="CLSID:CA8A9780-280D-11CF-A24D-444553540000" id="AcroRead" height="100%" width="100%"></object> 
08.
    <script type="text/vbscript"> 
09.
        Args = Split(App.CommandLine, """ ") 
10.
 
11.
        If UBound(Args) = 1 Then 
12.
            Arg = Trim(Replace(Args(1), """", "")) 
13.
        Else 
14.
            MsgBox "Falsche Anzahl an Argumenten", vbExclamation, "Fehler . . ." 
15.
            Window.Close 
16.
        End If 
17.
  
18.
       'Methoden Siehe AcroPDFLib.AcroPDF 
19.
        If AcroRead.LoadFile(Arg) Then 
20.
            MsgBox "OK" 
21.
        Else 
22.
            MsgBox "Nicht OK"   'z.B. Datei nicht gefunden 
23.
        End If 
24.
         
25.
       'AcroRead.SetShowToolbar False 
26.
       'AcroRead.SetShowScrollbars False 
27.
       'AcroRead.SetLayoutMode "SinglePage" 
28.
       'AcroRead.SetView "Fit" 
29.
         
30.
        Window.Close 
31.
   </script> 
32.
  </body> 
33.
</html>
Gruß Dieter
Bitte warten ..
Mitglied: Friemler
28.01.2013 um 11:38 Uhr
Hallo Dieter,

Zitat von 76109:
Bei defekten PDF's gibt LoadFile auch True zurück...

das ist natürlich schade. Mangels defekter PDF-Dateien hatte ich zum Testen eine leere Datei erstellt und mit der Dateierweiterung pdf versehen. In diesem Fall hat LoadFile korrekterweise False zurückgeliefert.

Gruß
Friemler
Bitte warten ..
Mitglied: 76109
28.01.2013, aktualisiert um 11:50 Uhr
Hallo Friemler!

das ist natürlich schade. Mangels defekter PDF-Dateien hatte ich zum Testen eine leere Datei erstellt und mit der Dateierweiterung pdf versehen. In diesem Fall hat LoadFile korrekterweise False zurückgeliefert.
Und ich habe zum Testen einfach mit einem Hex-Editor einige Daten am Anfang einer PDF-Datei mit einem x-beliebigen Zeichen überschrieben

Das ist wirklich schade... Aber möglicherweise funktionierts ja unter der Einbeziehung von Window-Buster, weil ja auch eine Meldung, wie beim AcorbatReader ausgegeben wird?

Gruß Dieter
Bitte warten ..
Mitglied: 76109
29.01.2013, aktualisiert um 11:00 Uhr
Hallo Friemler!

Habe das HTA-Skript ein wenig angepasst und scheint zu funktionieren. Allerdings kann das Skript keinen Exit-Code zurückgeben, aber da ja sowieso Log-Files geschrieben werden sollen/sollten, müssten die MsgBox-Zeilen nur durch entsprechende Codezeilen ersetzt werden.

Nach dem Ladevorgang wird ein Timer gesetzt und nach Ablauf des Timers wird getestet, ob eine Adobe-Meldung aktiviert werden kann (True/False), wobei True auf eine defekte PDF-Datei hinweist. Im Anschluss wird das Browser-Fenster automatisch geschlossen...

01.
<html> 
02.
  <head> 
03.
    <title>PDF Test</title> 
04.
    <hta:application id="App" scroll="no" windowstate="maximize"> 
05.
  </head> 
06.
  <body> 
07.
    <object classid="CLSID:CA8A9780-280D-11CF-A24D-444553540000" id="AcroRead" height="100%" width="100%"></object> 
08.
    <script type="text/vbscript"> 
09.
        Args = Split(App.CommandLine, """ ") 
10.
 
11.
        If UBound(Args) = 1 Then 
12.
            Arg = Trim(Replace(Args(1), """", "")) 
13.
        Else 
14.
            MsgBox "Falsche Anzahl an Argumenten!", vbExclamation, "Fehler . . ." 
15.
            Window.Close 
16.
        End If 
17.
  
18.
       'Methoden Siehe AcroPDFLib.AcroPDF 
19.
        If AcroRead.LoadFile(Arg) Then 
20.
            Window.SetInterval "TestAcroErr", 500   'Zeit in Millisekunden bei Bedarf anpassen 
21.
        Else 
22.
            MsgBox "Fehler"  'Datei nicht gefunden... 
23.
            Window.Close 
24.
        End If 
25.
         
26.
        Sub TestAcroErr() 
27.
            If CreateObject("WScript.Shell").AppActivate("Adobe") Then 
28.
                MsgBox "Fehler"   'Datei defekt... 
29.
            Else 
30.
                MsgBox "OK" 
31.
            End If 
32.
            Window.Close 
33.
        End Sub 
34.
 </script> 
35.
  </body> 
36.
</html>
Gruß Dieter

[edit] etwas nachgebessert und den Titel-Text auf "Adobe" reduziert [/edit]
Bitte warten ..
Mitglied: Friemler
29.01.2013 um 09:40 Uhr
Moin Dieter,

auf jeden Fall interessant. Aber die ganze Sache mit dem Adobe Reader ActiveX Control scheint nicht so einfach zu sein. Ich habe für meine Tests auch eine PDF-Datei durch Überschreiben einiger Bytes im Datei-Header künstlich zerstört. Beim Öffnen dieser Datei kam dann eine Fehlermeldung, in deren Titelzeile der String "Adobe PDF-Dokument" erschien. Dieses Fenster wurde von AppActivate natürlich nicht gefunden und das Ergebnis für diese Datei war falsch.

Da der TO die Lösung mit dem ActiveX Control höchstwahrscheinlich nicht verwenden kann, werde ich weitere Nachforschungen in dieser Richtung unterlassen.

Gruß
Friemler
Bitte warten ..
Mitglied: 76109
29.01.2013, aktualisiert um 10:58 Uhr
Hallo Friemler!

OK ist aber auch kein Problem, da bei AppActivate der Titel-Text nicht vollständig sein muss.

So würde es auch gehen:
01.
Result = objShell.AppActivate "Adobe" 
Gruß Dieter

PS. Den letzten Code entsprechend nachgebessert...
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
XML
XML Datei Fehler? (1)

Frage von Patrick-IT zum Thema XML ...

Microsoft Office
gelöst Excel Pdf Datei als Icon Symbol in Word einfügen per Drag and drop? (4)

Frage von Geforce zum Thema Microsoft Office ...

VB for Applications
gelöst PDF Datei auslesen und per VBA in Excel schreiben (3)

Frage von Julian8990 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...