cacheDirectory = $cacheDirectory; } protected function sanitizeOptions(array $options): array { $configs = new ConfigVariables(); $fonts = new FontVariables(); $allowed = [ 'mode', 'format', 'default_font_size', 'default_font', 'margin_left', 'margin_right', 'margin_top', 'margin_bottom', 'margin_header', 'margin_footer', 'orientation' ]; $filtered = array_filter($options, function ($key) use ($allowed, $configs, $fonts) { if (!\in_array($key, $allowed)) { if (!\array_key_exists($key, $configs->getDefaults())) { return \array_key_exists($key, $fonts->getDefaults()); } } return true; }, ARRAY_FILTER_USE_KEY); if (\array_key_exists('tempDir', $filtered)) { unset($filtered['tempDir']); } return $filtered; } /** * @param string $html * @param array $options * @return mixed|string * @throws \Mpdf\MpdfException */ public function convertToPdf(string $html, array $options = []) { $options = array_merge( $this->sanitizeOptions($options), ['tempDir' => $this->cacheDirectory, 'exposeVersion' => false] ); $mpdf = new Mpdf($options); $mpdf->creator = Constants::SOFTWARE; // some OS do not follow the PHP default settings if ((int) ini_get('pcre.backtrack_limit') < 1000000) { @ini_set('pcre.backtrack_limit', '1000000'); } // reduce the size of content parts that are passed to MPDF, to prevent // https://mpdf.github.io/troubleshooting/known-issues.html#blank-pages-or-some-sections-missing $parts = explode('', $html); for ($i = 0; $i < \count($parts); $i++) { $mpdf->WriteHTML($parts[$i]); if ($i < \count($parts) - 1) { $mpdf->WriteHTML(''); } } return $mpdf->Output('', Destination::STRING_RETURN); } }