public function output($html = null)
    {
        $Engine = $this->engine();
        if (!$Engine) {
            throw new Exception(__d('cake_pdf', 'Engine is not loaded'));
        }

        if ($html === null) {
            $html = $this->_render();
        }
        $this->html($html);

        $cacheKey = null;
        $cache = $this->cache();
        if ($cache) {
            $cacheKey = md5(serialize($this));
            $cached = Cache::read($cacheKey, $cache);
            if ($cached) {
                return $cached;
            }
        }

        $output = $Engine->output();

        if ($this->protect()) {
            $output = $this->crypto()->encrypt($output);
        }

        if ($cache) {
            Cache::write($cacheKey, $output, $cache);
        }

        return $output;
    }