listigerteppich
Goto Top

VB 2008 - PDF-Seitenanzahl in ein log-file schreiben

Hallo beisammen !

Ich schreibe an einem Programm, dass von mehreren PDF-Files die Seitenzahl auslesen und diese in ein log-File schreiben soll. Hat einer von euch evtl. ne schlaue Idee wie das in VB 2008 umzusetzen ist?

mfg,

Listiger

Content-Key: 130699

Url: https://administrator.de/contentid/130699

Printed on: April 25, 2024 at 09:04 o'clock

Member: Biber
Biber Dec 01, 2009 at 17:51:23 (UTC)
Goto Top
Moin listigerTeppich,

Zitat von @listigerTeppich:
Ich schreibe an einem Programm, dass von mehreren PDF-Files die Seitenzahl auslesen und diese in ein log-File schreiben soll.
Hat einer von euch evtl. ne schlaue Idee wie das in VB 2008 umzusetzen ist?

mfg,

Listiger
Hmmm, ist das denn wirklich alles, was du zum heutigen Zeitpunkt über die genaue Aufgabenstellung bereit bist preiszugeben?

Würde es dir oder deinen Cheffes eventuell die ängstlich durchwachten Nächte verkürzen, wenn wir MitleserInnen alle gemeinsam eine Verschwiegenheitserklärung bezüglich eurer betrieblichen Abläufe blanko unterzeichen?

Oder wenn einer der gelangweilten Moderatoren eventuell versehentlich im Klartext eingetippte Verzeichnis- oder Programmnamen anonymisiert oder mit "###" unkenntlich macht?

Oder hat dir eine viel zu früh verschiedene Patentante beigebracht, dass durch ein kokettes Zurückhalten von Details erst richtig das Interesse, die Neugier und oft auch die Leidenschaft entfacht wird und sicherlich ganz ganz schnell viele viele Nachfragen kommen werden?

Ich frag mal anders:
  • wodurch genau sind diese PDF-Dateien beschreibbar? Liegen die an einem bestimmten Ort, wurden die gedruckt, sind die nur einen Tag alt?
  • wer oder was soll denn wann sagen: "Hey, zähl mir alle PDF-Seiten für meine Vorratsdatenspeicherung!"
  • WTHF ist denn das übergeordnete Ziel dieser " "Hey, zähl mir alle PDF-Seiten"-Aktion?
  • WTHBF ist denn an diesen Details so schützenswert???

Grüße
Biber,
Moderator und eigentlich einer der In-sich-Ruhenden hier
Member: listigerTeppich
listigerTeppich Dec 02, 2009 at 07:56:06 (UTC)
Goto Top
ehehe, 1A Humor Biber, sehr zum schmunzeln - besonders der Patentanten-Abschnitt.

Also das übergeordnete Ziel der ganzen Action ist das mitprotokolieren der Seitenzahlen von PDF-Dateien. Wir versenden unser gesamtes Druckgut an ein großes externes Druckzentrum und wolln den groben Überblick behalten wie viele Seiten die denn wirklich zu drucken hatten. Könnt ja durchaus sein, dass ein spitzfindiger Zeitgaynosse, mit nicht zu unterschätzender krimineller Energie, mal versuchen sollte 2-3 Blätter mehr abzurechnen.

Kurz zurück zu den Fakten:

Alle PDF-Dateien liegen im selben Ordner und sollen mittels ButtonClick des VB2008-Programmes an dem ich sitze, an das Druckzentrum übertragen werden. Als zusätzliches Feature wäre das Mitloggen der (PDF-)Dateinamen (was kein Problem ist) und eben auch der jeweiligen Seitenanzahl dieser (größeres Problem) durchaus wünschenswert.

Aja, bei Bedarf häng ich hier auch gern noch meinen aktuellen Programmstand rein.. weiss nur nich ob das zum jetztigen Zeitpunkt nich overpowered wär oder ob die Informationen schon soweit ausreichend sind?
Member: Biber
Biber Dec 02, 2009 at 08:09:00 (UTC)
Goto Top
Moin listigerTeppich,

danke für die Erläuterung.

Aus deiner Antwort würde ich schliessen, dass der (geplante) Ablauf so aussieht:
  • in einem Verzeichnis XY laufen den ganzen Tag PDF-Dateien ein von euren druckenden BenutzerInnen
  • bis dann alle 4, 8 oder alle 24 Stunden der ganze Klump zusammengezippt wird und per Fahrradbote oder wie auch immer an dieses Druckzentrum geht
  • --------hier bzw. vor dem nächsten Schritt soll sich dein Seitenzähl-Schnipsel einklinken ----
  • dann werden alle *.pdfs gelöscht/gemoved/als versendet gekennzeichnet

Ist das halbwegs so korrekt (ich kenne den Ablauf mit einem Druckzentrum nicht aus eigener Erfahrung) ?

Und gibt es einen bestimmten Grund, das in VB 200x zusammenzubraten?
Ich meine, es gibt ja solche out-of-the-Box-Tools wie pdftk, die auch hier im Forum durchdekliniert worden sind...

Grüße
Biber
Member: listigerTeppich
listigerTeppich Dec 02, 2009 at 10:01:17 (UTC)
Goto Top
Jawollja, der Ablauf is im groben so wie du ihn beschrieben hast...

der Grund warum ich VB benutzen möchte ist, dass das Übermittlungs-Programm schon in VB 2008 geschrieben ist. Zudem ist es leider in unserer Umgebung sehr aufwändig bis unmöglich neue Software installiert/genehmigt zu bekommen, gerade dann wenn es Freeware ist (bei der Support nicht immer greifbar ist)

Hab auch schon nach VB-Lösungen geforstet und den Schnipsel hier gefunden:

Sub PDFCounter()
Dim buf As String, fil As String, i As Integer
Dim fso, pdf, pos As Integer, p2 As Integer
a = FreeFile
fil = InputBox("Pfad zur PDF")
Set fso = CreateObject("Scripting.FileSystemObject")
Set pdf = fso.OpenTextFile(fil)
Do While Not pdf.AtEndOfStream
buf = pdf.ReadLine
pos = InStr(1, buf, "/Count")
If pos > 0 Then
buf = Mid(buf, pos + 7)
p2 = InStr(1, buf, Chr(13))
If p2 <> 0 Then
buf = Left(buf, p2 - 1)
End If
i = CLng(buf)
Exit Do
End If
Loop
Range("a3") = i
End Sub

allerdings kann mein compiler (bzw. ich) damit zurzeit noch wenig anfangen. Kannst du mir evtl. sagen ob das hier ein Ansatz ist den es zu verfolgen lohnt, oder ob ne andere Umsetzung mehr verspricht.
Member: Biber
Biber Dec 02, 2009 at 10:43:16 (UTC)
Goto Top
Moin listigerTeppich,

im Prinzip lässt sich die Mimik von diesem VBA-Schnipsel doch übernehmen... ein PDF lässt sich durchaus als Textdatei öffnen, ein FileSystemObject gibt es natürlich auch in VB und ebenso ein TextStream-Object....

Aber
Wenn denn nu' wirklich, wie dem Schnipsel-Algorithmus vorgekaspert, das ganze streng behütete Geheimnis des PDF-Seitenzählens darin besteht, in allen vorhandenen PDF-Dateien nach einem Vorkommnis des Strings "/Count" am Zeilenanfang zu suchen, dann kann das auch ein FindStr-Aufruf
findstr /B /C:"/Count" X:\Deinpfad\*.pdf  

Grüße
Biber
Member: listigerTeppich
listigerTeppich Dec 02, 2009 at 16:29:06 (UTC)
Goto Top
Hi Biber,

mhww, gute Frage ob der Algorhitmus das nur vorkaspert oder ob an der Count-Sache was dran ist. In dem Forum aus dem ich den Schnipsel hab, wurd geschrieben dasses so nur geht wenn die PDFs keine Kapitel haben (was bei uns def. der Fall ist).
Ich bin ja generell immer für einfache Lösungen und deine Umsetzung klingt auch sehr verlockend, aber iwie auch fast schon zu einfach :D
Der Schnipsel fragt ja in der Schleife den "Count "-String pro Datei so lange ab, bis die PDF-Datei einmal ganz durchgerasselt is..zumindest versteh ichs so... könnte man das noch in deine Variante einbaun? Würd die dann nämlich doch gern mal testen

Gruß,

Listiger
Member: Biber
Biber Dec 02, 2009 at 18:01:29 (UTC)
Goto Top
Moin listigerTeppich,

sagen wir so...
ich kann von hier aus nicht hundertprozentig erkennen, was diese eine CMD-Findstr-Zeile rausschreibt, wenn sie gegen deine PDFs abgefeuert wird.
Das wäre ein POC, den du machen müsstest. face-wink

Bei "meinen" PDFs kommt raus, dass zwar die meisten PDFs
  • genau einmal ein Vorkommnis des Strings "/Count" am Zeilenanfang haben
  • und das auch dahinter lesbar eine Zahlenangabe im Klartext steht (siehe gleich).
>findstr /B /C:"/Count" *.pdf  
it_training-biber_faq.pdf:/Count 1005
Oracle_SQL_Tuning_Tools.pdf:/Count 13
db2cert7015-a4.pdf:/Count 30
VeranstaltungskalenderNeuwülferode2009.pdf:/Count 2
db2_trigger.pdf:/Count 6

soweit die gute Nachricht

Aber andere PDFs haben eben
  • irgendwo zwar nur eine Fundstelle "/Count", aber NICHT am Anfang einer Zeile
  • oder zwar MEHRERE "/Count"-Fundstellen mit Werten dahinter, von denen aber nur einziger positiv ist (der ist gleich der Gesamtzahl Seiten) und x mal "/Count -nn" (negativer Wert) ,was wohl vielleicht eine Seitenzahl pro Kapitel sein könnte...(?)


Anyhow... der optimistische Algorithmus aus dem gefundenen Schnipsel oben wird nur mit Glück bei dir passen...
...andererseits...
ein Abfeuern der "Findstr"-Zeile kostet ja nix. wenn eure PDFs so simpel gestrickt sind, dann klappt es ja vielleicht.

---> wenn nicht (also der realistisch zu erwartende Fall), dann solltest du VOR jeglicher Programmierung erstmal eine Suchmaschine deines Vertrauens nach den Details des PDF-Formats befragen ... und/oder nach der Ermittlung der Seiten/Pages in einem PDF-Dokument.

Da wollte ich dir nicht vorgreifen.

Grüße
Biber
Member: listigerTeppich
listigerTeppich Dec 04, 2009 at 10:21:35 (UTC)
Goto Top
Hi Biber,


jo, bei einfachen PDFs geht die findstr-Methode wunderbar. Leider werden diese einfachen PDFs noch vor dem Versenden zu einer bzw. mehreren großen PDF mit durchaus bis zu 500MB gemerged. Die Software haut beim mergen auch gleich alle Count Variablen weg...sehr ärgerlich...auch die komplette Seitenzahl is nicht wirklich aufzufinden.

Bei einer Seitenzahl von 4845 sind im Editor lediglich folgende Zeilen zu finden:

.endsteam.endobj.14845
.endsteam.endobj.34845
.endsteam.endobj.124845
.endsteam.endobj.148454

aber auch Werte wie:

.endsteam.endobj.48447

sind vorhanden...ein automatisiertes Auslesen ist also wohl sehr schwierig bis unmöglich... Wenn du noch eine Idee hättest wäre ich dir dankbar, ansonsten muss ich wohl versuchen auf externe Tools (pdftk sieht ja sehr vielversprechend aus) auszuweichen oder die Seitenzahlen vor dem mergen abzugreifen.

Gruß,

Listiger
Member: Biber
Biber Dec 04, 2009 at 16:55:24 (UTC)
Goto Top
Moin ListigerTeppich,

meine Strategie habe ich oben erläutert .
  • Entweder du stellst dich auf den Standpunkt, du hast das passende Werkzeug (VB2008) und die fehlt nur die Dokumentation des PDF-Formates -->dann musst du die suchen
  • oder du sagst "Da frag ich einen, der was davon versteht" bzw. einen der dieses Rad schon erfunden hat -->z.B pdftk

Rein handwerklich wird es ja wohl kein Hexenwerk werden, wenn eine PDF-Format-Dokumentation vorläge.
Aber der Aufwand, da ohne Doku mit Hex-editor und geschärften Sinnen durch ein 500 GByte-PDF zu scrollen auf der Suche nach einem möglicherweise "passenden" Seitenzahlwert..... würde mich abschrecken.

Grüße
Biber