Su richiesta ecco un programmello
https://ufile.io/7i4j
TINIETTO 0.1 - inietto file dentro FEL-XML
Devono esistere esattamente 3 parametri
filexml filedainiettare filexmliniettato
esempio
"f:\IT123456780_0001.xml" "z:\fatturainpdf.pdf" "z:\fatturainiettata.xml"
col sorgentello
program tinietto;
{$APPTYPE CONSOLE}
/// serve il file jclmime.pas
/// essenzialmente la libreria JEDI
uses
Jclmime,
classes,
SysUtils;
procedure logganow(i_stringa:string);
begin
writeln(i_stringa);
end;
/// è una funzione a 64bit, sprecata ma pazienza
function prendiDimensioneFile(i_nomefile:string):int64;
var
SearchRec : TSearchRec;
begin
if FindFirst(i_nomefile, faAnyFile, SearchRec ) = 0 then
Result := Int64(SearchRec.FindData.nFileSizeHigh) shl Int64(32) +
Int64(SearchREc.FindData.nFileSizeLow)
else
Result := 0;
sysutils.FindClose(SearchRec);
end;
/// abbastanza triste, ma per estensioni multiple
function prendiEstensione(i_nomefile:string):string;
var
i:integer;
punto:integer;
begin
Result:='';
if i_nomefile='' then
exit;
i_nomefile:=extractfilename(i_nomefile);
punto:=pos('.',i_nomefile);
if punto=0 then
exit;
punto:=length(i_nomefile);
while (i_nomefile[punto]<>'.') and (punto>1) do
dec(punto);
if punto=0 then
exit;
for i:=punto+1 to length(i_nomefile) do
result:=result+i_nomefile[i];
end;
function isEstensione(i_nomefile:string;i_estensione:string):boolean;
begin
result:=false;
if i_nomefile='' then Exit;
if i_estensione='' then Exit;
Result:=UpperCase(prendiEstensione(i_nomefile))=UpperCase(i_estensione);
end;
function isXML(i_nomeword:string):boolean;
begin
result:=isestensione(i_nomeword,'XML')
end;
/// usiamo la libreria per convertire il file in stringa.
function g_filetomime64(i_file:string):string;
var
aOutput: TStringStream;
FS:TMemoryStream;
begin
Result:='';
if not FileExists(i_file) then
begin
logganow('Errore 6923 non esiste file '+i_file);
exit;
end;
FS := TMemoryStream.Create;
FS.LoadFromFile(i_file);
aOutput := TStringStream.Create('');
try
MimeEncodeStreamNoCRLF(fs, aOutput);
Result := aOutput.DataString;
finally
aOutput.Free;
fs.Free;
end;
end;
/// queste sono funzioncine che ho scritto per creare i file XML
/// come quelli dell'AdE.
/// 0 manipolazioni XML; tutto stringhe
function g_spazi(i_volte:integer):string;
var
i:integer;
begin
result:='';
if i_volte<=0 then Exit;
for i:=1 to i_volte div 4 do
Result:=result+chr(9);
end;
function g_fatturaScriviRiga(i_offset:Integer;i_fattura:tstringlist;i_riga:string):Boolean;
begin
result:=False;
if i_offset<0 then
begin
loggaNow('Errore 12212 i_offset negativo');
exit;
end;
if i_fattura=nil then
begin
loggaNow('Errore 445 i_fattura vuota');
Exit;
end;
if i_riga='' then
begin
logganow('Errore 3359 i_riga vuota');
Exit;
end;
i_fattura.add(g_spazi(i_offset)+i_riga);
result:=True;
end;
function g_fatturaScriviTag(i_offset:Integer;i_fattura:tstringlist;i_tag:string;i_stringa:string):Boolean;
begin
result:=False;
if i_offset<0 then
begin
loggaNow('Errore 44212 i_offset negativo');
exit;
end;
if i_fattura=nil then
begin
logganow('Errore 3422 fattura vuota');
exit;
end;
if i_tag='' then
begin
logganow('Errore 6859 i_tag vuoto');
Exit;
end;
i_fattura.add(g_spazi(i_offset)+'<'+i_tag+'>'+i_stringa+'</'+i_tag+'>');
result:=True;
end;
/// funzione molto triste, ma molto utile
function g_fatturasostituiscitag(i_stringa:string;i_nometag:string;i_sostituto:String):string;
var
inizio:integer;
fine:integer;
i:integer;
s:string;
begin
Result:=i_stringa;
inizio:=Pos('<'+lowercase(i_nometag)+'>',LowerCase(i_stringa));
if inizio>0 then
begin
fine:=Pos('</'+lowercase(i_nometag)+'>',LowerCase(i_stringa));
if fine>0 then
begin
s:='';
for i:=1 to inizio-1 do
s:=s+i_stringa[i];
s:=s+i_sostituto;
for i:=fine+length(i_nometag)+3 to Length(i_stringa) do
s:=s+i_stringa[i];
result:=s;
end;
end
else
begin
inizio:=Pos('</'+lowercase('FatturaElettronicaBody')+'>',LowerCase(i_stringa));
if inizio>0 then
begin
s:='';
for i:=1 to inizio-1 do
s:=s+i_stringa[i];
s:=s+i_sostituto;
for i:=inizio to Length(i_stringa) do
s:=s+i_stringa[i];
result:=s;
end;
end;
end;
/// qui c'è un minimo di resilienza: se il file XML ha già una sezione
/// attachment viene sostituita. Ma solo la PRIMA!
function g_fel_inietta_file(i_filexml:string;i_fileiniettato:string;i_fileoutput:string):Boolean;
var
filemime:string;
fattura:TStringList;
sl:TStringList;
filestringa:string;
s:string;
begin
Result:=false;
if i_filexml='' then
begin
logganow('Errore 3012 file xml vuoto');
Exit;
end;
if not FileExists(i_filexml) then
begin
logganow('Errore 3011 file xml non esiste '+i_filexml);
exit;
end;
if i_fileiniettato='' then
begin
logganow('Errore 3013 file iniettato vuoto');
Exit;
end;
if not FileExists(i_fileiniettato) then
begin
logganow('Errore 3045 file iniettato non esiste '+i_fileiniettato);
Exit;
end;
if prendiDimensioneFile(i_fileiniettato)>2000000 then
begin
logganow('Errore 3044 file da iniettare >2MB '+i_fileiniettato);
Exit;
end;
filemime:=g_filetomime64(i_fileiniettato);
fattura:=tstringlist.create;
g_fatturaScriviRiga(4,fattura,'<Allegati>');
g_fatturaScriviTag(8,fattura,'NomeAttachment',ExtractFileName(i_fileiniettato));
g_fatturaScriviTag(8,fattura,'FormatoAttachment',prendiestensione(i_fileiniettato));
g_fatturaScriviTag(8,fattura,'DescrizioneAttachment','allegati fattura');
g_fatturaScriviTag(8,fattura,'Attachment',filemime);
g_fatturaScriviRiga(4,fattura,'</Allegati>');
sl:=tstringlist.create;
sl.LoadFromFile(i_filexml);
filestringa:=sl.text;
s:=g_fatturasostituiscitag(filestringa,'allegati',fattura.text);
sl.Text:=s;
if fileexists(i_fileoutput) then
deletefile(pchar(i_fileoutput));
if fileexists(i_fileoutput) then
logganow('Errore 333 highlander i_fileoutput '+i_fileoutput);
try
sl.SaveToFile(i_fileoutput);
except
on e:exception do
begin
logganow('Errore 239 '+e.Message);
end;
end;
sl.Free;
fattura.free;
Result:=FileExists(i_fileoutput);
end;
var
filexmlin:string;
filedainiettare:string;
filexmlout:string;
s:string;
inizio:TDateTime;
begin
if ParamCount<>3 then
begin
Writeln('TINIETTO 0.1 - inietto file dentro FEL-XML');
Writeln('Devono esistere esattamente 3 parametri');
Writeln('filexml filedainiettare filexmliniettato');
writeln('esempio');
Writeln('"f:\IT123456780_0001.xml" "z:\fatturainpdf.pdf" "z:\fatturainiettata.xml"');
exit;
end;
filexmlin:=ParamStr(1);
filedainiettare:=ParamStr(2);
filexmlout:=ParamStr(3);
if not FileExists(filexmlin) then
begin
writeln('Errore 260 il file XML in non esiste '+filexmlin);
exit;
end;
if not isXML(filexmlin) then
begin
writeln('Errore 288 il file XML non ha estensione xml '+filexmlin);
Exit;
end;
if not FileExists(filedainiettare) then
begin
writeln('Errore 261 il file da iniettare non esiste '+filedainiettare);
exit;
end;
/// in questo esempio non sovrascrivo output.
/// ognuno si regoli come gli pare
if FileExists(filexmlout) then
begin
writeln('Errore 263 il file FEL-XML destinazione ESISTE '+filexmlout);
exit;
end;
if not isXML(filexmlout) then
begin
writeln('Errore 307 il file XML out ha estensione xml '+filexmlout);
Exit;
end;
writeln('TINIETTO: inietto in FEL XML un file qualsiasi');
Writeln('Lavoro con parametri');
Writeln('File FEL-XML in '+filexmlin);
Writeln('File da iniettare '+filedainiettare);
Writeln('File FEL-XML out '+filexmlout);
inizio:=now;
if g_fel_inietta_file(filexmlin,filedainiettare,filexmlout) then
Writeln('Iniezione effettuata su '+filexmlout+' ('+inttostr(prendidimensionefile(filexmlout))+' bytes) in '+floattostr(now-inizio))
else
writeln('+KO qualcosa andato storto');
end.