vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
Seitengröß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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Seitengröße einer PDF auslesen 
Autor: ModeratorDieter (Moderator)
Datum: 14.12.12 00:17

Mit VB6-Boardmitteln geht das nicht.
Es gibt hierzu verschiedene PDF-Tools (meist kostenpflichtig), mit denen man PDF-Dateien analysieren, auslesen, und noch mehr machen kann.

_________________________
Professionelle Entwicklerkomponenten
www.tools4vb.de

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 ...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel