Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PDF-Datei in Base64-String und wieder zurück?

120 views
Skip to first unread message

Christian Nennewitz

unread,
May 6, 2010, 7:45:47 AM5/6/10
to
Hallo NG.

Ich m�chte irgendwelche Dateien die auf der Festplatte sind, z.B. pdf-
Dateien, in das Base64 Format konvertieren. Dabei herauskommen
soll ein String und den m�chte ich in einer Access-Tabelle speichern
z.B. in ein Memo-Feld.

Anders herum m�chte ich aus diesen Base64-Strings nachher wieder
g�ltige(!) Dateien auf der Festplatte erzeugen.

Es mu� wohl unbedingt Base64 sein weil ich Daten von einer Beh�rde
bekomme bei denen das bereits so verschl�sselt ist.

Ich habe zwar schon eine Reihe von Base64-Funktionen f�r Access
gefunden, z.B. das hier:

http://www.dbwiki.de/wiki.php?title=VBA_Tipp:_Base64-Kodierung

aber genau das oben beschriebene mit den Dateien leider
nicht. Hat dazu schon jemand etwas Fertiges gemacht?

Ich stelle mir so etwas vor wie:
=ConvertToBase64(strDateiname)
ConvertToDatei(strBase64)

Gru�,
Christian Nennewitz


Stefan Dase

unread,
May 6, 2010, 8:26:32 AM5/6/10
to
Hallo Christian!

> Ich mᅵchte irgendwelche Dateien die auf der Festplatte sind, z.B. pdf-


> Dateien, in das Base64 Format konvertieren. Dabei herauskommen

> soll ein String und den mᅵchte ich in einer Access-Tabelle speichern
> z.B. in ein Memo-Feld.

www.donkarl.com?FAQ2.2 kennst du, speziell die 2. Variante? Dies
Vorgehen lᅵsst sich auf alle Arten von Dateien anwenden.

Eine Codierung in ein bestimmtes Format ist dabei m.E. nicht notwendig,
da du den Inhalt nicht interpretieren musst. Wichtig wᅵre das, wenn eine
Gegenstelle wie z.B. ein Webservice Base64 erwartet.

Beachte aber auch, dass eine Access-Datenbank maximal 2 GB groᅵ werden
kann! Endlos viele Dateien wirst du also nicht ablegen kᅵnnen.

Viele Grᅵᅵe aus Bremen,
Stefan

Christian Nennewitz

unread,
May 6, 2010, 8:30:07 AM5/6/10
to
Hallo Stefan.

> www.donkarl.com?FAQ2.2 kennst du, speziell die 2. Variante? Dies Vorgehen

> l�sst sich auf alle Arten von Dateien anwenden.

Danke f�r den Hinweis. Ich mu� aber leider zwingend mit
Bin�rdaten im Base64-Format umgehen k�nnen.

Gru�,
Christian Nennewitz


Stefan Dase

unread,
May 6, 2010, 9:02:14 AM5/6/10
to
Hallo Christian!

> Danke fᅵr den Hinweis. Ich muᅵ aber leider zwingend mit
> Binᅵrdaten im Base64-Format umgehen kᅵnnen.

Fᅵr das Speichern in der Datenbank ist es vᅵllig egal, welches Format
die Datei hat. Da du die Inhalte nicht weiterverarbeitest, sondern nur
von der Festplatte binᅵr in eine Tabelle speicherst und dann wieder
binᅵr dorthin zurᅵckschreibst, macht es keinen Unterschied ob Base64 o.ᅵ.

Und deiner Ausgangsfrage entnehme ich, dass diese Daten bereits Base64
codiert vorliegen. Da wᅵre eine nochmalige Codierung auch Mumpitz.

Versuche doch einfach mal, mit den in der F.A.Q. beschriebenen Methode,
eine Datei zwischenzuspeichern und dann wieder herzustellen. Klappt das?

Viele Grᅵᅵe aus Bremen,
Stefan

P.S.: Es korrigiere mich jemand, wenn ich ganz groᅵen Mist erzᅵhle.

Christian Nennewitz

unread,
May 6, 2010, 9:41:29 AM5/6/10
to
Hallo Stefan.

> Und deiner Ausgangsfrage entnehme ich, dass diese Daten bereits Base64

> codiert vorliegen. Da w�re eine nochmalige Codierung auch Mumpitz.

Ich glaube ich habe das etwas zu ungenau formuliert.

Ich habe eine XML-Datei mit irgendwelchen Daten, die
ich in Access einlese. Bei diesen Daten k�nnen auch
Base64 verschl�sselte PDF-Dateien dabei sein. D.h. ich
ben�tige eine Funktion mit der man diese Base64-
Zeichenketten wieder entschl�sseln kann.

Andersherum, wenn ich aus meinen Access-Daten wieder
eine XML-Datei erzeugen m�chte, mu� ich meine evtl.
erzeugten PDF-Dateien auch wieder ins Base64-Format
konvertieren weil der Empf�nger sonst nichts damit an-
fangen kann.

Es gibt ja auch offenbar die M�glichkeit dieses zu tun, leider
habe ich noch nichts f�r Access gefunden, da� sich einfach
verwenden lie�e.

Das man Bin�rdaten generell in Access speichern kann be-
zweifle ich ja nicht. Aber das n�tzt mir in diesem Falle wenig.

Gru�,
Christian


Christian Nennewitz

unread,
May 6, 2010, 10:06:14 AM5/6/10
to
Hallo,

Ich habe mittlerweile hier
http://www.f2ko.de/Deutsch/index.php
ein Programm von Fatih Kodak gefunden, mit
dem man Base64 Daten aus einer Datei
erzeugen kann und umgekehrt.

Ich denke mal das m��te man mit einem
Shell-Aufruf auch in Access einbauen
k�nnen.

Ein Klassenmodul oder ein normales Modul
w�re mir zwar lieber aber ich denke ich
komme damit hin.

Gru�,
Christian


Josef Poetzl

unread,
May 6, 2010, 10:23:00 AM5/6/10
to
Hallo!

Christian Nennewitz schrieb:


> Ein Klassenmodul oder ein normales Modul
> w�re mir zwar lieber aber ich denke ich
> komme damit hin.

eine kurze Suche nach "base64 binary vba" brachte mich zu dieser
Seiten: http://www.vbforums.com/showthread.php?t=379072

Damit kann man Strings konvertieren.
Wenn du dann den erhaltenen String mit Put als Datei speicherst,
m�sste die PDF eigentlich funktionsf�hig sein.
(Ausprobiert habe ich den Code allerdings nicht.)


mfg
Josef

Jens Schilling

unread,
May 6, 2010, 1:10:07 PM5/6/10
to
Hallo, Christian

Christian Nennewitz wrote:
> Es gibt ja auch offenbar die M�glichkeit dieses zu tun, leider
> habe ich noch nichts f�r Access gefunden, da� sich einfach
> verwenden lie�e.

Schau mal hier:

http://www.dbwiki.de/wiki.php?title=Access_Beispieldatenbanken

Da kannst Du eine DB mit einem Klassenmodul zur
Base64-Kodierung/-Dekodierung finden.

--
Gruss
Jens

FAQ: http://www.donkarl.com


Christian Nennewitz

unread,
May 7, 2010, 2:04:15 AM5/7/10
to
Hallo Josef und Jens.

Vielen Dank f�r Eure Hinweise. Tats�chlich habe
ich auch einen Haufen Beispiele gefunden mit denen
man Strings in Base64 und umgekehrt konvertieren
kann.

Leider fehlt mir aber das Wissen, wie man dies
auf Dateien anwendet.

Wenn ich z.B. eine Bin�r Datei einlesen und als String
speichern m�chte. Wie macht man denn das? Und zwar
so, da� dabei keine Daten verloren gehen?

Ich werde es mal, wie Josef geschrieben hat, mit Put
und Get versuchen. Leider bin ich kein Experte was
das verarbeiten von Bin�rdateien betrifft. Bisher hatte
ich immer nur mit "normalen" Textdateien zu tun.

Gru�,
Christian Nennewitz


Wolfgang Badura

unread,
May 9, 2010, 7:57:04 AM5/9/10
to
Hallo Christian!

"Christian Nennewitz" <Nenn...@dej.de> wrote in message
news:hs0ah2$mlj$1...@online.de...


> Wenn ich z.B. eine Bin�r Datei einlesen und als String
> speichern m�chte. Wie macht man denn das? Und zwar
> so, da� dabei keine Daten verloren gehen?

Ich habe zwei Funktionen, die von und nach Base64 konvertieren k�nnen.
Jene, die Base64 dekodiert habe ich in Verwendung, die nach Base64
konvertiert habe ich noch nie ben�tigt, und daher �berhaupt nicht getestet.
Falls Du noch Bedarf hast, bitte hier mitzuteilen, dann schaue ich mir diese
Funktion samt drumherum an und poste sie hier.

Gr��e aus Wien,
Wolfgang


Christian Nennewitz

unread,
May 10, 2010, 6:11:46 AM5/10/10
to
Hallo Wolfgang.

> Ich habe zwei Funktionen, die von und nach Base64 konvertieren k�nnen.
> Jene, die Base64 dekodiert habe ich in Verwendung, die nach Base64
> konvertiert habe ich noch nie ben�tigt, und daher �berhaupt nicht
> getestet.
> Falls Du noch Bedarf hast, bitte hier mitzuteilen, dann schaue ich mir
> diese
> Funktion samt drumherum an und poste sie hier.

Das h�rt sich ja richtig gut an. W�rde mich ja schon mal interessieren,
wie Du das machst. Ist aber eigentlich nicht mehr n�tigt. Ich habe es
mittlerweile mit einer externen Datei "Base64.exe"* gel�st, die ich mit
WaitShell aufrufe und dann die erzeugten Daten wieder in Access einlese.

Trotzdem vielen Dank f�r Deine angebotene Hilfe.

Gru�,
Christian Nennewitz

*
http://www.f2ko.de/Deutsch/index.php


Wolfgang Badura

unread,
May 14, 2010, 2:11:05 AM5/14/10
to
Hallo Christian!
"Christian Nennewitz" <Nenn...@dej.de> wrote in message
news:hs8m54$1mj$1...@online.de...

>> Falls Du noch Bedarf hast, bitte hier mitzuteilen, dann schaue ich mir
>> diese
>> Funktion samt drumherum an und poste sie hier.
>
> Das h�rt sich ja richtig gut an. W�rde mich ja schon mal interessieren,

Ich hatte leider nicht sofort Zeit, eine Testumgebung f�r die Routinen zu
schreiben, deshalb erst jetzt den Code:


Option Explicit
Option Compare Database

' Konstante f�r En- und Decode Base64
Public encodeArr(64) As String * 1
Public decodeArr(255) As Byte
Public Const EncChars = _
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _
"abcdefghijklmnopqrstuvwxyz" & _
"0123456789+/"

' Base64-Tabellen erzeugen
Sub Base64_Init()
Dim i As Long
Dim ch As String
Dim iFileNummer As Integer
Dim lX As Long

For i = 0 To 255: decodeArr(i) = 0: Next i ' l�schen Tabelle decodeArr
For i = 1 To Len(EncChars) ' 1-64
ch = Mid(EncChars, i, 1)
encodeArr(i - 1) = ch ' encodeArr(Laufindex-1) = Zeichen
decodeArr(Asc(ch)) = i - 1 ' decodeArr(mit dem Wert von Zeichen) =
Laufindex-1
Next i
End Sub

' string in Base64 encodieren
Function Base64_Encode(strIn As String) As String
Dim strOut As String, a(2) As Byte
Dim N0 As Long, N1 As Long, N2 As Long, N3 As Long
Dim Ausg As Long, i As Long, j As Long

strOut = ""
i = 1: Ausg = 3
Do While i <= Len(strIn)
For j = 0 To 2
If i <= Len(strIn) Then
a(j) = Asc(Mid(strIn, i, 1)): i = i + 1
Else
a(j) = 0: Ausg = Ausg - 1
End If
Next j
N0 = (a(0) \ 4) And &H3F
N1 = ((a(0) * 16) And &H30) + ((a(1) \ 16) And &HF)
N2 = ((a(1) * 4) And &H3C) + ((a(2) \ 64) And &H3)
N3 = a(2) And &H3F
strOut = strOut & encodeArr(N0) & encodeArr(N1) & _
IIf(Ausg > 1, encodeArr(N2), "=") & IIf(Ausg > 2, encodeArr(N3), "=")
Loop
Base64_Encode = strOut
End Function

' string aus Base64 decodieren
' aus http://www.dbwiki.de/wiki.php?title=VBA_Tipp:_Base64-Kodierung
Function Base64_Decode(strIn As String) As String
Dim strOut As String
Dim A0 As Long, A1 As Long, A2 As Long, A3 As Long
Dim B0 As Long, B1 As Long, B2 As Long, B3 As Long
Dim i As Long

strOut = ""
For i = 1 To Len(strIn) - 3 Step 4
B0 = Asc(Mid$(strIn, i, 1)): A0 = decodeArr(B0)
B1 = Asc(Mid$(strIn, i + 1, 1)): A1 = decodeArr(B1)
B2 = Asc(Mid$(strIn, i + 2, 1)): A2 = decodeArr(B2)
B3 = Asc(Mid$(strIn, i + 3, 1)): A3 = decodeArr(B3)
strOut = strOut & Chr(((A0 * 4) Or (A1 \ 16)) And &HFF)
If B2 <> Asc("=") Then strOut = strOut & Chr(((A1 * 16) Or (A2 \ 4)) And
&HFF)
If B3 <> Asc("=") Then strOut = strOut & Chr(((A2 * 64) Or A3) And &HFF)
Next i
Base64_Decode = strOut
End Function

' File encodieren
Sub EncodeBase64()
On Error Resume Next
Const BufLen As Integer = 57

Dim Filenumbin As Integer
Dim Filenumtxt As Integer
Dim str As String
Dim FileLenBin As Long

Base64_Init

Filenumbin = FreeFile()
Open "D:\DATEN\EMail\003225_001_Mail_10_001_inv_9266074336_635764606.pdf"
For Binary As Filenumbin
FileLenBin = LOF(Filenumbin)
Filenumtxt = FreeFile()
Open "D:\Temp\inv_9266074336_635764606.txt" For Output As Filenumtxt

Do While Not EOF(Filenumbin)
If FileLenBin > BufLen Then str = String(BufLen, 0) Else str =
String(FileLenBin, 0)
Get Filenumbin, , str
Print #Filenumtxt, Base64_Encode(str)
FileLenBin = FileLenBin - Len(str)
If FileLenBin <= 0 Then Exit Do
Loop
Close
End Sub

' File decodieren
Sub DecodeBase64()
On Error Resume Next

Dim Filenumbin As Integer
Dim Filenumtxt As Integer
Dim str As String

Base64_Init

Filenumtxt = FreeFile()
Open "D:\Temp\inv_9266074336_635764606.txt" For Input As Filenumtxt
Kill ("D:\TEMP\inv_9266074336_635764606.pdf")
Filenumbin = FreeFile()
Open "D:\Temp\inv_9266074336_635764606.pdf" For Binary As Filenumbin

Line Input #Filenumtxt, str
Do While Not EOF(Filenumtxt)
If Len(str) > 0 Then Put Filenumbin, , Base64_Decode(str)
Line Input #Filenumtxt, str
Loop
Close
End Sub

Du mu�t nat�rlich die Dateinamen �ndern.

Ich m�chte noch erw�hnen, da� auch mittels des Objektes "CDO.Message"
De- und Encodierung vorgenommen werden kann.

Mit Gru� aus Wien,
Wolfgang

Christian Nennewitz

unread,
May 17, 2010, 2:00:41 AM5/17/10
to
Hallo Wolfgang.

Vielen Dank f�r den Code. Ich glaube da kann ich noch
das ein- oder andere daraus lernen.

Viele Gr��e,
Christian Nennewitz


Gerhard

unread,
Jul 28, 2011, 2:20:40 PM7/28/11
to
hallo,
ich habe ein problem mit nachstehendem code

ausgangssituation:

ich habe einen soap envelope der mit eine base64 encodierte pdf als
string �bergibt

diesen base64 string mu� ich wieder zu binary kriegen und habe dies mit
nachstehender funktion versucht

dazu schreibe ich den base64 string in eine textdatei

dim vsource as string
vsource = "d:\test.txt"

dim vtarget as string
vtarget = "d:\test.pdf"

d.h. der string wird in die vsource geschrieben was auch funktioniert

nun habe ich nachstehenden code so ge�ndert dass er als parameter
vsource und vtarget �bergeben bekommt und die jeweiligen .txt und .pdf
strings im code durch vsource und vtarget ersetzt

wenn ich den code laufen lasse springt er mit allerdings in der do while
schleife raus, d.h. filenumtxt ist EOF

und auch str scheint "" zu sein

wo liegt der fehler ?

danke
Gerhard

Wolfgang Badura

unread,
Jul 29, 2011, 7:50:18 AM7/29/11
to
Hallo Gerhard!

"Gerhard" <deve...@it-creations.com> schrieb im Newsbeitrag
news:j0s99p$67f$1...@news.albasani.net...


> hallo,
> ich habe ein problem mit nachstehendem code
>
> ausgangssituation:
>
> ich habe einen soap envelope der mit eine base64 encodierte pdf als string

> �bergibt
>
> diesen base64 string muďż˝ ich wieder zu binary kriegen und habe dies mit

> nachstehender funktion versucht
>
> dazu schreibe ich den base64 string in eine textdatei
>
> dim vsource as string
> vsource = "d:\test.txt"
>
> dim vtarget as string
> vtarget = "d:\test.pdf"
>
> d.h. der string wird in die vsource geschrieben was auch funktioniert
>

> nun habe ich nachstehenden code so ge�ndert dass er als parameter vsource
> und vtarget �bergeben bekommt und die jeweiligen .txt und .pdf strings im

So trifft man sich wieder!

1. Wird in die Do While Schleife �berhaupt verzeweigt?
2. Enth�lt D:\Temp\inv_9266074336_635764606.txt Daten mit Zeilenwechsel,
oder ist der File vielleicht leer?
3. Kannst Du einige Zeilen posten?

Du kannst mir den Textfile senden, falls Du nicht weiterkommst.

Wolfgang


0 new messages