| |
Visual-Basic EinsteigerSeitengröße einer PDF auslesen | | | Autor: BotschafterSarek | Datum: 13.12.12 06:28 |
| Hallo zusammen,
gibt es eine Möglichkeit, mit VB6 die Seitengröße (also zum Beispiel 210 x 297 mm) auszulesen?
Danke im Voraus,
Sarek | |
Re: Seitengröße einer PDF auslesen | | | Autor: BotschafterSarek | Datum: 14.12.12 05:57 |
| Ich habe inzwischen einen Weg gefunden. Der Vollständigkeit halber (falls jemand hier im Forum mal danach sucht) sei er hier kurz beschrieben:
Da PDF-Dateien im Prinzip reine Textdateien sind, kann man sie ganz normal öffnen und Zeichen für Zeichen analysieren.
Die Seitengröße verbirgt sich in folgender Zeichenkette:
"MediaBox[0 0 436.547 612.379]" oder "MediaBox [0 0 842 595]" (also mit oder ohne Leerzeichen vor der eckigen Klammer). Die vier Zahlen in den eckigen Klammern sind X-Startposition, Y-Startposition, X-Endposition, Y-Endposition. Man kann also wie folgt vorgehen:
1. Suche den String "MediaBox[" oder "MediaBox ["
2. Ab dem Zeichen "[" analysiere zeichenweise
3. Die Zeichen bis zum ersten Leerzeichen sind Ziffern und unter Umständen ein Dezimalpunkt, speichere dies als Zahl in die Variable Xstart.
4. Speichere die Zeichen bis zum zweiten Leerzeichen als Zahl in die Variable Ystart
5. Speichere die Zeichen bis zum dritten Leerzeichen als Zahl in die Variable Xende
6. Speichere die Zeichen bis zum abschließenden "]" als Zahl in die Variable Yende
7. Die Seitenbreite in mm ist: (Xende - Xstart) / 2.84
8. Die Seitenbreite in mm ist: (Yende - Ystart) / 2.84
Den Faktor 2.84 habe ich empirisch aus PDF-Dateien verschiedener Größe ermittelt. Seltsamerweise habe ich dabei aber verschiedene Werte bekommen, mal 2.835, mal 2.833 und so weiter. Die 2.84 sind der gerundete Mittelwert dieser Werte. Die errechneten Seitengrößen müssen daher auch auf ganze Zahlen gerundet werden. Das mag nicht die genaueste Lösung sein, aber für meine Zwecke reicht es.
Es gibt neben der "MediaBox" übrigens noch andere Boxen:
http://de.wikipedia.org/wiki/Portable_Document_Format#Angaben_der_Seitengeometrie
Schöne Grüße,
Sarek
Beitrag wurde zuletzt am 14.12.12 um 05:58:31 editiert. | |
Re: Seitengröße einer PDF auslesen | | | Autor: rince | Datum: 18.09.14 09:17 |
| Hallo Sarek,
hallo Community,
ich habe aktuell auch das Problem, dass ich per VB PDF-Seitengrößen ermitteln muss und dein Post ist der einzig wirklich hilfreiche im Web gewesen. Zwar musste ich mir den Code anhand deiner Beschreibung hart erarbeiten und es etwas anders handhaben, aber grundsätzlich super Lösungsansatz!
Ich habe allerdings jetzt das Problem, dass nicht alle PDF-Dateien sauber bzw. komplett eingelesen werden können. Als ich mir die nicht komplett einlesbaren PDF-Dateien per Notepad genauer angeschaut habe ist mir aufgefallen, dass bei den betroffenen PDF-Dateien die Mediabox erst nach einem "Wust" von PostScript-Zeichen kommt. Das Script liest den "Quellcode" der PDF nur bis zu einem PS-Steuerbefehl (NUL) ein und gibt den Rest nicht mehr aus, wodurch natürlich auch die Mediabox nicht mehr ausgelesen werden kann.
Ich habe bereits versucht per InStr und Right dieses Zeichen zu löschen, beim Einlesen der Datei ist dieses Zeichen aber schon nicht mehr im lesbaren Bereich und kann somit nicht gefunden und ersetzt/gelöscht werden.
Da ich den Code in einem Output Management Programm einbetten möchte kommen externe Lösungen wie pdfinfo/ghostscript o.ä. nicht in Frage.
Hat jemand eine Idee wie ich diese Steuerzeichen vorab per VB löschen kann? Wenn ich dieses Zeichen z.B. hier eintrage wird es als Leerzeichen dargestellt, weshalb ich es leider nicht zeigen kann.
Oder gibt es in VB die Möglichkeit die PDF-Datei in eine PostScript-Datei zu konvertieren, ohne ein externes Programm zu verwenden?
Über jede Antwort wäre ich dankbar! | |
Re: Seitengröße einer PDF auslesen | | | Autor: eierlein | Datum: 18.09.14 10:18 |
| Zitat: | | Das Script liest den "Quellcode" der PDF nur bis zu einem PS-Steuerbefehl (NUL) ein und gibt den Rest nicht mehr aus, | |
Wurde die Datei im Binärmodus geöffnet? 0 | |
Re: Seitengröße einer PDF auslesen | | | Autor: rince | Datum: 18.09.14 10:43 |
| Hallo eierlein,
danke für die schnelle Rückmeldung. Ich bin noch ein blutiger Anfänger bezüglich VB. Ich wüsste nicht wie ich dies bewerkstelligen sollte.
Folgend mal mein bisher geschriebener Code:
' Variable Dateiname setzen
Dateiname = "C:\Test\1143522_RB~0.pdf"
' Datei öffnen/auslesen
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTest = objFSO.GetFile(Dateiname)
If objTest.Size > 0 Then
Set objFile = objFSO.OpenTextFile(Dateiname, ForReading)
strText = objFile.ReadAll
objFile.Close
end if
' PDF nach einem String durchsuchen und den Startpunkt ermitteln
abmessungen_start1 = InStr(strText,"MediaBox[")+9
abmessungen_start2 = InStr(strText,"MediaBox [")+9
' tatsächlichen Startpunkt in Abhängigkeit von start1 und start2 ermitteln
if(abmessungen_start1="9") then
abmessungen_start = abmessungen_start2
elseif(abmessungen_start1<>"9") then
abmessungen_start = abmessungen_start1
end if
' Position an der die abschliessende eckige Klammer steht
abmessungen_end = InStr(abmessungen_start,strText,"]",1)+1
' Zeichenlaenge der Werte innerhalb der eckigen Klammern
laenge_start_to_end = abmessungen_end - abmessungen_start - 1
' Bereich in dem die Werte der PDF-Groesse in den eckigen Klammern steht
abmessungen = mid(strText, abmessungen_start, laenge_start_to_end)
' Bereich zerlegen in einzelne Werte
abmessungen_splitten = Split(abmessungen," ")
abmessungen_einzeln = ubound(abmessungen_splitten)
for i=0 to abmessungen_einzeln
abmessungen_x = abmessungen_splitten(1) / 2.834 / 100
abmessungen_y = abmessungen_splitten(2) / 2.834 / 100
abmessungen_breite = abmessungen_splitten(3) / 2.834 / 100
abmessungen_hoehe = abmessungen_splitten(4) / 2.834 / 100
next
' Nachkommastellen bei Abmessungen in mm entfernen (z.B. 210,06 mm = 210 mm)
If InStrRev(abmessungen_breite, ",") > 0 Then abmessungen_breite = Left( _
abmessungen_breite, InStrRev(abmessungen_breite, ",") - 1)
If InStrRev(abmessungen_hoehe, ",") > 0 Then abmessungen_hoehe = Left( _
abmessungen_hoehe, InStrRev(abmessungen_hoehe, ",") - 1)
' Werte in globale Variablen in Outputmanagement Software eintragen
'Watch.setvariable "global.PDFxPosition", abmessungen_x
'Watch.setvariable "global.PDFyPosition", abmessungen_y
'Watch.setvariable "global.PDFbreite", abmessungen_breite
'Watch.setvariable "global.PDFhoehe", abmessungen_hoehe
' Ergebnis ausgeben in Windows Fenster zur Überprüfung (nicht relevant für
' Outputmanagementsystem)
Msgbox(abmessungen)
Msgbox(abmessungen_x)
Msgbox(abmessungen_y)
Msgbox(abmessungen_breite)
Msgbox(abmessungen_hoehe)
Beitrag wurde zuletzt am 18.09.14 um 10:45:31 editiert. | |
Re: Seitengröße einer PDF auslesen | | | Autor: rince | Datum: 18.09.14 13:02 |
| Ich habe nun nochmals eine der betroffenen PDF-Dateien in eine PostScript-Datei gewandelt. Aus der PostScript-Datei kann ich die Seitengröße sauber auslesen.
Gibt es die Möglichkeit ein PDF in PostScript zu konvertieren, per VB Script? Ohne Verwendung eines externen Programms... | |
Re: Seitengröße einer PDF auslesen | | | Autor: eierlein | Datum: 18.09.14 19:24 |
| In VBS gibt's keinen Binärmodus.
Ich hab das Programm testweise nach VB6 (VBA) konvertiert.
Da hast du keine Probleme mit CHR(0).
Option Explicit
Sub test()
Dim FF As Integer
Dim abmessungen_start As Long
Dim abmessungen_start1 As Long
Dim abmessungen_start2 As Long
Dim abmessungen_end As Long
Dim laenge_start_to_end As Long
Dim abmessungen_einzeln As Long
Dim i As Long
Dim Start_x As Double, Start_y As Double
Dim Ende_x As Double, Ende_y As Double
Dim abmessungen_breite As Double, abmessungen_hoehe As Double
Dim msg As String, t As String
Dim abmessungen As String
Dim abmessungen_splitten() As String
Dim strText As String
Dim DateiName As String
' Variable Dateiname setzen
DateiName = "D:\U70-1F300.pdf" '"C:\Test\1143522_RB~0.pdf"
' Datei öffnen/auslesen
FF = FreeFile
Open DateiName For Binary As #FF
strText = Space$(LOF(FF))
Get #FF, , strText
Close
' PDF nach einem String durchsuchen und den Startpunkt ermitteln
abmessungen_start1 = InStr(strText, "MediaBox[")
abmessungen_start2 = InStr(strText, "MediaBox [")
' tatsächlichen Startpunkt in Abhängigkeit von start1 und start2 ermitteln
If abmessungen_start1 Then
abmessungen_start = abmessungen_start1 + 9
ElseIf abmessungen_start2 Then
abmessungen_start = abmessungen_start2 + 9
Else
MsgBox ("Fehler")
Exit Sub
End If
' Position an der die abschliessende eckige Klammer steht
abmessungen_end = InStr(abmessungen_start, strText, "]", 1) + 1
' Zeichenlaenge der Werte innerhalb der eckigen Klammern
laenge_start_to_end = abmessungen_end - abmessungen_start - 1
' Bereich in dem die Werte der PDF-Groesse in den eckigen Klammern steht
abmessungen = Mid$(strText, abmessungen_start, laenge_start_to_end)
' Bereich zerlegen in einzelne Werte
abmessungen_splitten = Split(abmessungen, " ")
Start_x = CDbl(abmessungen_splitten(0))
Start_y = CDbl(abmessungen_splitten(1))
Ende_x = CDbl(abmessungen_splitten(2))
Ende_y = CDbl(abmessungen_splitten(3))
' Nachkommastellen bei Abmessungen in mm entfernen (z.B. 210,06 mm = 210 mm)
abmessungen_breite = Int((Ende_x - Start_x) / 2.834)
abmessungen_hoehe = Int((Ende_y - Start_y) / 2.834)
msg = "Abmessungen:" & vbLf & _
"x = " & CStr(Start_x) & vbLf & _
"y = " & CStr(Start_y) & vbLf & _
"Höhe = " & CStr(abmessungen_hoehe) & vbLf & _
"Breite = " & CStr(abmessungen_breite)
t = MsgBox(msg, 64)
End Sub 0 | |
Re: Seitengröße einer PDF auslesen | | | Autor: BotschafterSarek | Datum: 19.09.14 11:40 |
| Zitat: | | Ich hab das Programm testweise nach VB6 (VBA) konvertiert. | |
Ich habe damals in der Tat auch mit VB6 gearbeitet. Mein "Quick&Dirty"-Code sah so aus:
Function PaperHeight(sFile)
Dim F As Integer
Dim nCount As Double
Dim sBuffer As String
Dim FileContent As String
Dim nFilePos As Double
Dim nSize As Double
Dim nBytes As Double
Dim nPos As Double
' Blockgröße
Const nBlockSize = 16384
' Datei im Binary-Mode öffnen
F = FreeFile
Open sFile For Binary As #F
' Datei blockweise auslesen
nSize = LOF(F)
nFilePos = 0
Do While nFilePos < nSize
nBytes = nBlockSize
If nFilePos + nBytes > nSize Then nBytes = nSize - nFilePos
' Inhalt lesen
sBuffer = Space$(nBytes)
Get #F, , sBuffer
FileContent = FileContent + sBuffer
nFilePos = nFilePos + nBytes
Loop
Close #F
SpaceCount = 0
FileLength = Len(FileContent)
zaehler1 = 1
Do Until Mid(FileContent, zaehler1, 9) = "MediaBox[" Or Mid(FileContent, _
zaehler1, 10) = "MediaBox ["
zaehler1 = zaehler1 + 1
Loop
If Mid(FileContent, zaehler1, 9) = "MediaBox[" Then Ueberspringen = 9
If Mid(FileContent, zaehler1, 10) = "MediaBox [" Then Ueberspringen = 10
For Zaehler2 = zaehler1 + Ueberspringen To FileLength
If SpaceCount = 3 Then
If Mid(FileContent, Zaehler2, 1) = "]" Then GoTo Finish:
PaperHeightString = PaperHeightString + Mid(FileContent, Zaehler2, 1)
End If
If SpaceCount = 2 Then
If Mid(FileContent, Zaehler2, 1) = " " Then GoTo Weiter2:
PaperWidthString = PaperWidthString + Mid(FileContent, Zaehler2, 1)
Weiter2:
End If
If SpaceCount = 1 Then
If Mid(FileContent, Zaehler2, 1) = " " Then GoTo Weiter1:
PaperHeightMinusString = PaperHeightMinusString + Mid(FileContent, _
Zaehler2, 1)
Weiter1:
End If
If SpaceCount = 0 Then
If Mid(FileContent, Zaehler2, 1) = " " Then GoTo Weiter0:
PaperWidthMinusString = PaperWidthMinusString + Mid(FileContent, Zaehler2, _
1)
Weiter0:
End If
If Mid(FileContent, Zaehler2, 1) = " " Then SpaceCount = SpaceCount + 1
Next Zaehler2
Finish:
PaperHeight = Val(PaperHeightString) - Val(PaperHeightMinusString)
PaperWidth = Val(PaperWidthString) - Val(PaperWidthMinusString)
End Function PaperHeight und PaperWidth sind globale Variablen - ein Hilfskonstrukt, da eine Funktion ja leider immer nur einen Rückgabewert kennt ... | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|