Results 1 to 10 of 10

Thread: XML met een embedded PDF

  1. #1

    XML met een embedded PDF

    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

  2. #2
    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.)

  3. #3
    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

  4. #4
    Snippet uit mijn programma.

    Delphi Code:
    1. function EncodeFileAsBase64String(const Filename: string): ansistring;
    2. var
    3.   Stream: TMemoryStream;
    4. begin
    5.   Stream := TMemoryStream.Create;
    6.   try
    7.     Stream.LoadFromFile(Filename);
    8.     Result := ansistring(TNetEncoding.Base64.EncodeBytesToString(Stream.Memory, Stream.size));
    9.   finally
    10.       Stream.Free;
    11.   end;
    12. end;
    13.  
    14. //...
    15.  
    16. if ReadSetting(datamd.database, 'Financieel', 'UBL PDF invoegen', false) and (Filename <> '') then // altijd als extra bijlage
    17. begin
    18.   aa := CreateChild(ndXml, 'cac:AdditionalDocumentReference');
    19.   bb := CreateChild(aa, 'cbc:ID', Filename);
    20.   bb := CreateChild(aa, 'cbc:DocumentType', 'PrimaryImage');
    21.   bb := CreateChild(aa, 'cac:Attachment');
    22.   cc := CreateChild(bb, 'cbc:EmbeddedDocumentBinaryObject', string(EncodeFileAsBase64String(Temp)), 'mimeCode', 'application/pdf');
    23. end;
    (ik neem aan dat je hier wel voldoende aan hebt, CreateChild is een eigen functie)

    Documentatie van bijlage in UBL.
    https://www.softwarepakketten.nl/wik...d_document.htm

    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.
    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.

  5. #5
    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

  6. #6
    Misschien dat EncdDecd wel bestaat in Delphi 7?

    Delphi Code:
    1. uses EncdDecd;
    2.  
    3. function EncodeFileAsBase64String(const Filename: string): ansistring;
    4. var
    5.   Stream: TMemoryStream;
    6. begin
    7.   Stream := TMemoryStream.Create;
    8.   try
    9.     Stream.LoadFromFile(Filename);
    10.     Result := ansistring(EncdDecd.EncodeBase64(Stream.Memory, Stream.size));
    11.   finally
    12.       Stream.Free;
    13.   end;
    14. end;

  7. #7
    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

  8. #8
    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:
    1. function EncodeFileAsBase64String(const Filename: string): ansistring;
    2. var
    3.   sInput: TFileStream;
    4.   sOutput: TMemoryStream;
    5. begin
    6.   sInput := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    7.   sOutput := TStringStream.Create;
    8.   try
    9.     EncdDecd.EncodeStream(sInput, sOutput);
    10.     Result := ansistring(PansiChar(sOutput.Memory));
    11.   finally
    12.       sInput.Free;
    13.       sOutput.Free;
    14.   end;
    15. end;

  9. #9
    Senior Member Delphiwizard's Avatar
    Join Date
    Dec 2006
    Location
    België
    Posts
    160
    Ik heb dit ook recent moeten doen om door te sturen via json:

    Delphi Code:
    1. Uses System.NetEncoding;
    2.  
    3. function EncodeFile(const FileName: string): AnsiString;
    4. var Instream, OutStream: TMemoryStream;
    5.     Base64: TBase64Encoding;
    6. begin
    7.    Instream := TMemoryStream.Create;
    8.    OutStream := TMemoryStream.Create;
    9.    try
    10.       Instream.LoadFromFile(Filename);
    11.       Base64 := TBase64Encoding.Create(0);
    12.       Base64.Encode(Instream, OutStream);
    13.       SetString(Result, PAnsiChar(OutStream.Memory), OutStream.Size);
    14.    finally
    15.       base64.Free;
    16.       Instream.Free;
    17.       OutStream.Free;
    18.     end;
    19. end;

  10. #10
    Het werkt !!
    Bedankt voor het advies
    De verbazing begint waar de kennis ophoudt

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •