WordPress.org

Make WordPress Core

Ticket #48853: 48853.1.diff

File 48853.1.diff, 2.6 KB (added by azaozz, 23 months ago)
  • src/wp-includes/class-wp-image-editor-imagick.php

     
    140140                try {
    141141                        $this->image    = new Imagick();
    142142                        $file_extension = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) );
    143                         $filename       = $this->file;
    144143
    145144                        if ( 'pdf' === $file_extension ) {
    146                                 $filename = $this->pdf_setup();
     145                                $pdf_loaded = $this->pdf_load_source();
     146
     147                                if ( is_wp_error( $pdf_loaded ) ) {
     148                                        return $pdf_loaded;
     149                                }
     150                        } else {
     151                                $this->image->readImage( $this->file );
    147152                        }
    148153
    149                         // Reading image after Imagick instantiation because `setResolution`
    150                         // only applies correctly before the image is read.
    151                         $this->image->readImage( $filename );
    152 
    153154                        if ( ! $this->image->valid() ) {
    154155                                return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file );
    155156                        }
     
    165166                }
    166167
    167168                $updated_size = $this->update_size();
     169
    168170                if ( is_wp_error( $updated_size ) ) {
    169171                        return $updated_size;
    170172                }
     
    794796                        // We want the thumbnail to be readable, so increase the rendering DPI.
    795797                        $this->image->setResolution( 128, 128 );
    796798
     799                        // Only load the first page.
     800                        return $this->file . '[0]';
     801                } catch ( Exception $e ) {
     802                        return new WP_Error( 'pdf_setup_failed', $e->getMessage(), $this->file );
     803                }
     804        }
     805
     806        /**
     807         * Load the image produced by Ghostscript.
     808         *
     809         * Includes a workaround for a bug in Ghostscript 8.7 that may prevent processing of some PDF files
     810         * when `use-cropbox` is set.
     811         *
     812         * @since 5.3.1
     813         *
     814         * @return true|WP_error
     815         */
     816        protected function pdf_load_source() {
     817                $filename = $this->pdf_setup();
     818
     819                if ( is_wp_error( $filename ) ) {
     820                        return $filename;
     821                }
     822
     823                try {
    797824                        // When generating thumbnails from cropped PDF pages, Imagemagick uses the uncropped
    798825                        // area (resulting in unnecessary whitespace) unless the following option is set.
    799826                        $this->image->setOption( 'pdf:use-cropbox', true );
    800827
    801                         // Only load the first page.
    802                         return $this->file . '[0]';
     828                        // Reading image after Imagick instantiation because `setResolution`
     829                        // only applies correctly before the image is read.
     830                        $this->image->readImage( $filename );
    803831                } catch ( Exception $e ) {
    804                         return new WP_Error( 'pdf_setup_failed', $e->getMessage(), $this->file );
     832                        // Attempt to run `gs` without the `use-cropbox` option. See #48853.
     833                        $this->image->setOption( 'pdf:use-cropbox', false );
     834
     835                        $this->image->readImage( $filename );
    805836                }
     837
     838                return true;
    806839        }
    807840
    808841}