Don't use
JSF to generate non-HTML content.
JSF is not an all-or-nothing architecture. A JSF app can also contain
servlets, traditional JSPs, and even
Struts code.
The power of JSF is that allows you to manage HTML content (especially form content) easily. It does that by assuming total control over the HttpResponse and its output stream, however, and you inject your own low-level efforts at your peril.
It's a lot safer, cleaner, and simpler to provide the ZIP download from a servlet that to try and force JSF to do it.
There's a related thread on this forum where I've discussed similar issues.
The secret of how to be miserable is to constantly expect things are going to happen the way that they are "supposed" to happen.
You can have faith, which carries the understanding that you may be disappointed. Then there's being a willfully-blind idiot, which virtually guarantees it.