You are here

class PdfFormat in Printer and PDF versions for Drupal 8+ 8

Same name and namespace in other branches
  1. 2.x modules/printable_pdf/src/Plugin/PrintableFormat/PdfFormat.php \Drupal\printable_pdf\Plugin\PrintableFormat\PdfFormat

Provides a plugin to display a PDF version of a page.

Plugin annotation


@PrintableFormat(
  id = "pdf",
  module = "printable_pdf",
  title = @Translation("PDF"),
  description = @Translation("PDF description.")
)

Hierarchy

Expanded class hierarchy of PdfFormat

File

modules/printable_pdf/src/Plugin/PrintableFormat/PdfFormat.php, line 28

Namespace

Drupal\printable_pdf\Plugin\PrintableFormat
View source
class PdfFormat extends PrintableFormatBase {

  /**
   * The PDF generator plugin manager service.
   *
   * @var \Drupal\pdf_api\PdfGeneratorPluginManager
   */
  protected $pdfGeneratorManager;

  /**
   * The PDF generator plugin instance.
   *
   * @var \Drupal\pdf_api\Plugin\PdfGeneratorInterface
   */
  protected $pdfGenerator;

  /**
   * The filename to use.
   *
   * @var string
   */
  protected $filename;

  /**
   * The path cerrent service.
   *
   * @var \Drupal\Core\Path\CurrentPathStack
   */
  protected $pathCurrent;

  /**
   * The request stack service.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  protected $requestStack;

  /**
   * {@inheritdoc}
   *
   * @param array $configuration
   *   The configuration array.
   * @param string $plugin_id
   *   The plugin id.
   * @param array $plugin_definition
   *   The plugin definition.
   * @param \Drupal\Core\Config\ConfigFactory $config_factory
   *   The config factory service.
   * @param \Drupal\pdf_api\PdfGeneratorPluginManager $pdf_generator_manager
   *   The PDF generator plugin manager service.
   * @param \Drupal\printable\PrintableCssIncludeInterface $printable_css_include
   *   The printable CSS include interface.
   * @param \Drupal\printable\LinkExtractor\LinkExtractorInterface $link_extractor
   *   The Link extractor service.
   * @param \Drupal\Core\Path\CurrentPathStack $pathCurrent
   *   Represents the current path for the current request.
   * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
   *   Request stack that controls the lifecycle of requests.
   */
  public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConfigFactory $config_factory, PdfGeneratorPluginManager $pdf_generator_manager, PrintableCssIncludeInterface $printable_css_include, LinkExtractorInterface $link_extractor, CurrentPathStack $pathCurrent, RequestStack $requestStack) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $config_factory, $printable_css_include, $link_extractor);
    $this->pdfGeneratorManager = $pdf_generator_manager;
    $this->pathCurrent = $pathCurrent;
    $this->requestStack = $requestStack;
    $pdf_library = (string) $this->configFactory
      ->get('printable.settings')
      ->get('pdf_tool');
    if (!$pdf_library) {
      return;
    }
    $pdf_library = strtolower($pdf_library);
    $this->pdfGenerator = $this->pdfGeneratorManager
      ->createInstance($pdf_library);
    if ($pdf_library != 'wkhtmltopdf') {
      return;
    }
    $options = [];
    $use_xvfb_run = (string) $this->configFactory
      ->get('printable.settings')
      ->get('print_pdf_use_xvfb_run');
    $path_to_xfb_run = (string) $this->configFactory
      ->get('printable.settings')
      ->get('path_to_xfb_run');
    $ignore_warnings = (bool) $this->configFactory
      ->get('printable.settings')
      ->get('ignore_warnings');
    if ($use_xvfb_run) {
      $options = [
        'use-xserver' => NULL,
        'commandOptions' => [
          'enableXvfb' => TRUE,
          'xvfbRunBinary' => $path_to_xfb_run,
        ],
        'ignoreWarnings' => $ignore_warnings,
      ];
    }
    $this->pdfGenerator
      ->getObject()
      ->setOptions($options);
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('config.factory'), $container
      ->get('plugin.manager.pdf_generator'), $container
      ->get('printable.css_include'), $container
      ->get('printable.link_extractor'), $container
      ->get('path.current'), $container
      ->get('request_stack'));
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'pdf_generator' => 'wkhtmltopdf',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function calculateDependencies() {
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $config = $this
      ->getConfiguration();
    $options = [];
    foreach ($this->pdfGeneratorManager
      ->getDefinitions() as $definition) {
      $options[$definition['id']] = $definition['title'];
    }
    $form['pdf_generator'] = [
      '#type' => 'radios',
      '#title' => 'PDF Generator',
      '#default_value' => $config['pdf_generator'],
      '#options' => $options,
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    $this
      ->setConfiguration([
      'pdf_generator' => $form_state['values']['pdf_generator'],
    ]);
  }

  /**
   * Get  the header content.
   *
   * @return string
   *   Content of header.
   */
  public function getHeaderContent() {
    $pdf_header = [
      '#theme' => 'printable_pdf_header',
    ];
    return render($pdf_header);
  }

  /**
   * Get  the footer content.
   *
   * @return string
   *   Content of footer.
   */
  public function getFooterContent() {
    $pdf_footer = [
      '#theme' => 'printable_pdf_footer',
    ];
    return render($pdf_footer);
  }

  /**
   * Get the HTML content for PDF generation.
   *
   * @return string
   *   HTML content for PDF.
   */
  public function buildPdfContent() {
    $content = parent::buildContent();
    $rendered_page = parent::extractLinks(render($content));
    return $rendered_page;
  }

  /**
   * Set formatted header and footer.
   */
  public function formattedHeaderFooter() {

    // And this can be used by users who do not want default one, this example
    // is for wkhtmltopdf generator.
    $this->pdfGenerator
      ->getObject()
      ->SetFooter('This is a footer on left side||' . 'This is a footer on right side');
  }

  /**
   * Return default headers (may be overridden by the generator).
   *
   * @param string $filename
   *   The filename to suggest to the browser.
   * @param bool $download
   *   Whether to download the PDF or display it in the browser.
   *
   * @return array
   *   Default headers for the response object.
   */
  private function getHeaders($filename, $download) {
    $disposition = $download ? 'attachment' : 'inline';
    return [
      'Content-Type' => Unicode::mimeHeaderEncode('application/pdf'),
      'Content-Disposition' => $disposition . '; filename="' . $filename . '"',
      'Content-Length' => filesize($filename),
      'Content-Transfer-Encoding' => 'binary',
      'Pragma' => 'no-cache',
      'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
      'Expires' => '0',
      'Accept-Ranges' => 'bytes',
    ];
  }

  /**
   * File send callback for the Streamed response.
   */
  public function streamResponseContent() {
    $this->pdfGenerator
      ->send();
  }

  /**
   * Remove tokens from images so we just get the path.
   */
  public function removeImageTokens($subject) {

    // We only need to do this for absolute paths, not external images, so
    // search for mentions of DRUPAL_ROOT.
    $next_pos = strpos($subject, DRUPAL_ROOT);
    while ($next_pos !== FALSE) {
      $have_matches = preg_match('/[\\s\'"]/', substr($subject, $next_pos), $matches, PREG_OFFSET_CAPTURE);
      $path_end = $have_matches ? $matches[0][1] : strlen($subject) - $next_pos + 1;
      $query_start = strpos(substr($subject, $next_pos, $path_end), '?');
      if ($query_start !== false) {
        $subject = substr($subject, 0, $next_pos + $query_start) . substr($subject, $next_pos + $path_end);
      }
      $next_pos = strpos($subject, DRUPAL_ROOT, $next_pos + $path_end - $query_start + 1);
    }
    return $subject;
  }

  /**
   * {@inheritdoc}
   */
  public function getResponse() {
    $paper_size = (string) $this->configFactory
      ->get('printable.settings')
      ->get('paper_size');
    $paper_orientation = $this->configFactory
      ->get('printable.settings')
      ->get('page_orientation');
    $path_to_binary = $this->configFactory
      ->get('printable.settings')
      ->get('path_to_binary');
    $save_pdf = $this->configFactory
      ->get('printable.settings')
      ->get('save_pdf');
    $pdf_location = $this->configFactory
      ->get('printable.settings')
      ->get('pdf_location');
    $raw_content = $this
      ->buildPdfContent();
    $pdf_content = $this
      ->removeImageTokens($raw_content);
    $footer_content = $this
      ->getFooterContent();
    $header_content = $this
      ->getHeaderContent();

    // $this->formattedHeaderFooter();
    $this->pdfGenerator
      ->setter($pdf_content, $pdf_location, $save_pdf, $paper_orientation, $paper_size, $footer_content, $header_content, $path_to_binary);
    if (empty($pdf_location)) {
      $pdf_location = str_replace("/", "_", $this->pathCurrent
        ->getPath()) . '.pdf';
      $pdf_location = substr($pdf_location, 1);
    }
    $this->filename = DRUPAL_ROOT . '/' . $pdf_location;
    $this->pdfGenerator
      ->save($this->filename);
    if ($this->pdfGenerator
      ->displayErrors()) {
      $source_url = $this->requestStack
        ->getCurrentRequest()
        ->getRequestUri();
      $pos = strpos($source_url, "printable");
      $source_url = substr($source_url, 0, $pos - 1);
      return new RedirectResponse($source_url);
    }
    return (new BinaryFileResponse($this->filename, 200, $this
      ->getHeaders($pdf_location, $save_pdf)))
      ->deleteFileAfterSend(true);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PdfFormat::$filename protected property The filename to use.
PdfFormat::$pathCurrent protected property The path cerrent service.
PdfFormat::$pdfGenerator protected property The PDF generator plugin instance.
PdfFormat::$pdfGeneratorManager protected property The PDF generator plugin manager service.
PdfFormat::$requestStack protected property The request stack service.
PdfFormat::buildConfigurationForm public function Form constructor. Overrides PluginFormInterface::buildConfigurationForm
PdfFormat::buildPdfContent public function Get the HTML content for PDF generation.
PdfFormat::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies
PdfFormat::create public static function Creates an instance of the plugin. Overrides PrintableFormatBase::create
PdfFormat::defaultConfiguration public function Gets default configuration for this plugin. Overrides PrintableFormatBase::defaultConfiguration
PdfFormat::formattedHeaderFooter public function Set formatted header and footer.
PdfFormat::getFooterContent public function Get the footer content.
PdfFormat::getHeaderContent public function Get the header content.
PdfFormat::getHeaders private function Return default headers (may be overridden by the generator).
PdfFormat::getResponse public function Returns the response object for this format plugin. Overrides PrintableFormatBase::getResponse
PdfFormat::removeImageTokens public function Remove tokens from images so we just get the path.
PdfFormat::streamResponseContent public function File send callback for the Streamed response.
PdfFormat::submitConfigurationForm public function Form submission handler. Overrides PluginFormInterface::submitConfigurationForm
PdfFormat::__construct public function Overrides PrintableFormatBase::__construct
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PrintableFormatBase::$configFactory protected property The config factory service.
PrintableFormatBase::$content protected property A render array of the content to be output by the printable format.
PrintableFormatBase::$footerContent protected property A string containing the list of links present in the page.
PrintableFormatBase::$linkExtractor protected property Printable link extractor.
PrintableFormatBase::$printableCssInclude protected property Printable CSS include manager.
PrintableFormatBase::buildContent protected function Build a render array of the content, wrapped in the printable theme.
PrintableFormatBase::extractLinks protected function Extracts the links present in HTML string.
PrintableFormatBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurablePluginInterface::getConfiguration
PrintableFormatBase::getDescription public function Returns the administrative description for this format plugin. Overrides PrintableFormatInterface::getDescription
PrintableFormatBase::getLabel public function Returns the administrative label for this format plugin. Overrides PrintableFormatInterface::getLabel
PrintableFormatBase::getOutput protected function Get the HTML output of the whole page and pass to the response object.
PrintableFormatBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurablePluginInterface::setConfiguration
PrintableFormatBase::setContent public function Set the content for the printable response. Overrides PrintableFormatInterface::setContent
PrintableFormatBase::validateConfigurationForm public function Form validation handler. Overrides PluginFormInterface::validateConfigurationForm 1
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.