PostRenderSubscriber.php in Entity Print 8        
                          
                  
                        
  
  
  
  
File
  src/EventSubscriber/PostRenderSubscriber.php
  
    View source  
  <?php
namespace Drupal\entity_print\EventSubscriber;
use Drupal\Component\Utility\Unicode;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\entity_print\Event\PdfEvents;
use Drupal\entity_print\Event\PdfHtmlAlterEvent;
use Masterminds\HTML5;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class PostRenderSubscriber implements EventSubscriberInterface {
  
  protected $configFactory;
  
  protected $requestStack;
  
  public function __construct(ConfigFactoryInterface $config_factory, RequestStack $request_stack) {
    $this->configFactory = $config_factory;
    $this->requestStack = $request_stack;
  }
  
  public function postRender(PdfHtmlAlterEvent $event) {
    
    if ($this->configFactory
      ->get('entity_print.settings')
      ->get('pdf_engine') !== 'phpwkhtmltopdf') {
      return;
    }
    $html_string =& $event
      ->getHtml();
    $html5 = new HTML5();
    $document = $html5
      ->loadHTML($html_string);
    
    $transform = function ($tag, $attribute) use ($document) {
      $base_url = $this->requestStack
        ->getCurrentRequest()
        ->getSchemeAndHttpHost();
      foreach ($document
        ->getElementsByTagName($tag) as $node) {
        $attribute_value = $node
          ->getAttribute($attribute);
        
        if (Unicode::substr($attribute_value, 0, 2) === '//') {
          $node
            ->setAttribute($attribute, $base_url . Unicode::substr($attribute_value, 1));
        }
        elseif (Unicode::substr($attribute_value, 0, 1) === '/') {
          $node
            ->setAttribute($attribute, $base_url . $attribute_value);
        }
      }
    };
    
    $transform('link', 'href');
    $transform('a', 'href');
    $transform('img', 'src');
    
    $html_string = $html5
      ->saveHTML($document);
  }
  
  public static function getSubscribedEvents() {
    return [
      PdfEvents::POST_RENDER => 'postRender',
    ];
  }
}