3

I have a module that create custom PDF with multiple selected nodes and I use the below function to create the link to styled images:

$file = File::load($img_id);
$imagesPath[] = ImageStyle::load('550x300')->buildUrl($file->uri->value);

Unfortunately, the image itself is not created, only the link, which is ok if I display it on a simple webpage because Drupal will create it on the fly when needed but on a PDF it cause errors because the image it not found before the PDF could be displayed.

Is there a programmatically way to create this image ?

Thanks.

5

You need to execute createDerivative() on ImageStyle.

$image_style = ImageStyle::load('550x300');

$file = File::load($img_id);
$image_uri = $file->getFileUri();
$destination = $image_style->buildUrl($file->uri->value);
$image_style->createDerivative($image_uri, $destination);

Docs: https://api.drupal.org/api/drupal/core%21modules%21image%21src%21Entity%21ImageStyle.php/function/ImageStyle%3A%3AcreateDerivative/8.6.x

For Drupal 7 there is image_style_create_derivative():

    $style = image_style_load('550x300');

    $file = file_load($img_id);
    $image_uri = $file->uri;
    $destination = image_style_path($style['name'], $image_uri);
    image_style_create_derivative($style, $image_uri, $destination);

Docs: https://api.drupal.org/api/drupal/modules%21image%21image.module/function/image_style_create_derivative/7.x

1

This can be achieved with Image Style Warmer module which is available for D8. Worked perfectly for me! This might help other people, who are trying to find a solution.

The Image Style Warmer module provides options to create image styles during upload or via queue worker. So configured image derivates already exists when they are requested.

  • Pre-generate configured image styles on image upload or crop change.
  • Pre-generate configured image styles via queue worker.

Your Answer

By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.