Credo stiate facendo un pochino di confusione.

@guidino:

hai creato uno script che crea al volo un file che (grazie agli header) viene scaricato.
Ci sarà quindi una pagina (precedente) che conterrà un normalissimo link al file che avvierà lo scaricamento del file.
Non c'è nessuna differenza con un link ad un file statico (ad esempio uno .zip).

Avendo impostato gli header, il tuo script è il file da scaricare e non può quindi avere un output a video (puoi dichiarare solo una volta gli header e quindi hai un solo tipo di output).


Se vuoi avere un'interazione più elaborata potresti:
- non impostare gli header
- creare il file sul filesystem server
- visualizzare il link al file

In questo modo il download non parte automaticamente (a meno di non farlo fare a JS)