Goedemiddag,
Ik ben op zoek naar een XML-component waarbij het mogelijk is om een PDF te embedden.
Ik werk nog met Delphi 7, de standaard componenten voor XML zijn eerder beperkt.
Zijn er tools waarbij dit mogelijk is?
Goedemiddag,
Ik ben op zoek naar een XML-component waarbij het mogelijk is om een PDF te embedden.
Ik werk nog met Delphi 7, de standaard componenten voor XML zijn eerder beperkt.
Zijn er tools waarbij dit mogelijk is?
De verbazing begint waar de kennis ophoudt
Gewoon de standaard TXMLDocument component.
Je kunt de PDF als string coderen met base64 en in een tag invoeren.
Als je er niet uitkomt kan ik wel een compleet voorbeeld geven.
Waar ben je mee bezig? (UBL? hoewel ze voor UBL adviseren de PDF niet te embeden.)
Dit klopt inderdaad. Voor een koppeling met een boekhoudpakket wordt UBL gevraagd met een embedded PDF.
Als ik een compleet voorbeeld zou hebben, zou dit wel handig zijn.
De verbazing begint waar de kennis ophoudt
Snippet uit mijn programma.
(ik neem aan dat je hier wel voldoende aan hebt, CreateChild is een eigen functie)Delphi Code:
function EncodeFileAsBase64String(const Filename: string): ansistring; var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try Stream.LoadFromFile(Filename); Result := ansistring(TNetEncoding.Base64.EncodeBytesToString(Stream.Memory, Stream.size)); finally Stream.Free; end; end; //... if ReadSetting(datamd.database, 'Financieel', 'UBL PDF invoegen', false) and (Filename <> '') then // altijd als extra bijlage begin aa := CreateChild(ndXml, 'cac:AdditionalDocumentReference'); bb := CreateChild(aa, 'cbc:ID', Filename); bb := CreateChild(aa, 'cbc:DocumentType', 'PrimaryImage'); bb := CreateChild(aa, 'cac:Attachment'); cc := CreateChild(bb, 'cbc:EmbeddedDocumentBinaryObject', string(EncodeFileAsBase64String(Temp)), 'mimeCode', 'application/pdf'); end;
Documentatie van bijlage in UBL.
https://www.softwarepakketten.nl/wik...d_document.htm
Ik dacht ooit ergens gelezen te hebben dat de voorkeur was om de PDF niet te embedden maar met dezelfde naam als de XML in de mail te zetten (kan het alleen niet meer terugvinden). Bij mij is het dus een instelling die aangezet kan worden.Vanuit de UBL Ketentest wordt geadviseerd om de factuur ook altijd in PDF mee te sturen, al dan niet embedded in de UBL (XML).
Dit is met name handig voor uitwisselen facturen per email, omdat de PDF dan direct leesbaar is.
Aandachtspunt m.b.t. factuur in PDF-formaat:
De volgende mogelijkheden zijn aanwezig om een factuur in PDF mee te sturen:
a. UBL factuur en PDF factuur elk apart; bijvoorbeeld elk als email-bijlage.
b. UBL factuur met embedded PDF factuur; bijvoorbeeld via PEPPOL.
c. UBL factuur zonder embedded PDF factuur; afgeraden door UBL Ketentest.
Goedemorgen.
De functie TNetEncoding kan niet gevonden worden, waarschijnlijk omdat ik met een oudere versie van Delphi werk.
De verbazing begint waar de kennis ophoudt
Misschien dat EncdDecd wel bestaat in Delphi 7?
Delphi Code:
uses EncdDecd; function EncodeFileAsBase64String(const Filename: string): ansistring; var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try Stream.LoadFromFile(Filename); Result := ansistring(EncdDecd.EncodeBase64(Stream.Memory, Stream.size)); finally Stream.Free; end; end;
EncdDecd bestaat inderdaad, maar EncodeBase64 bestaat niet, enkel EncodeStream.
Ik ga er van uit dat EncodeStream 32bit is en EncodeBase64 64 bits ?
De verbazing begint waar de kennis ophoudt
Nee. In nieuwere versies is EncodeBase64 een functie die memory omzet naar een base64 string.
EncodeStream pakt een input-stream en schrijft base64 naar een output stream.
function EncodeBase64(const Input: Pointer; Size: Integer): AnsiString;
procedure EncodeStream(Input, Output: TStream);
Je zou de functie dus aan kunnen passen dat je naar een TMemoryStream schrijft en dat weer in een ansistring zet.
Dus misschien zoiets? (uit de losse vuist)
Delphi Code:
function EncodeFileAsBase64String(const Filename: string): ansistring; var sInput: TFileStream; sOutput: TMemoryStream; begin sInput := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); sOutput := TStringStream.Create; try EncdDecd.EncodeStream(sInput, sOutput); Result := ansistring(PansiChar(sOutput.Memory)); finally sInput.Free; sOutput.Free; end; end;
Ik heb dit ook recent moeten doen om door te sturen via json:
Delphi Code:
Uses System.NetEncoding; function EncodeFile(const FileName: string): AnsiString; var Instream, OutStream: TMemoryStream; Base64: TBase64Encoding; begin Instream := TMemoryStream.Create; OutStream := TMemoryStream.Create; try Instream.LoadFromFile(Filename); Base64 := TBase64Encoding.Create(0); Base64.Encode(Instream, OutStream); SetString(Result, PAnsiChar(OutStream.Memory), OutStream.Size); finally base64.Free; Instream.Free; OutStream.Free; end; end;
Het werkt !!
Bedankt voor het advies
De verbazing begint waar de kennis ophoudt
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks