Это то, для чего предназначена ваша первая строка header
: скажите браузеру, что файл должен быть загружен, а не отображен, и скажите ему, каким должно быть имя файла.
header('Content-disposition: attachment; filename='.$_SESSION['bookName'].'.html');
Это filename=
часть говорит браузеру, каким должно быть имя файла.Он обрезается в первом пробеле (только с первым словом), потому что имена с пробелами должны быть заключены в двойные кавычки в заголовке Content-disposition:
header('Content-disposition: attachment; filename="'.$_SESSION['bookName'].'.html"');