From 35e6dbe14f80ca28818e1de656600e586a1cc939 Mon Sep 17 00:00:00 2001 From: Mike Schroder Date: Wed, 26 Oct 2016 07:27:51 +0000 Subject: [PATCH] Media: Add support for rendering PDF thumbnails. When support for PDFs is available, on upload, render 'Thumbnail', 'Medium', 'Large', and 'Full' sizes of the first page, and save them in attachment meta. Use these renders within Add Media, Media Gallery and List views, Attachment Details, Post/Attachment Edit screens, and Attachment pages. Support available by default via Imagick -> ImageMagick -> Ghostscript, but can be provided by any `WP_Image_Editor` that supports PDFs. Props adamsilverstein, azaozz, celloexpressions, desrosj, dglingren, ericlewis, ipstenu, joemcgill, joyously, markoheijnen, melchoyce, mikeschroder, tomauger. Fixes #31050. git-svn-id: https://develop.svn.wordpress.org/trunk@38949 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/image.php | 42 +++++++++++++- src/wp-admin/includes/media.php | 12 +++- .../class-wp-image-editor-imagick.php | 14 ++++- src/wp-includes/media-template.php | 6 +- src/wp-includes/media.php | 53 ++++++++++++++---- .../data/images/wordpress-gsoc-flyer.pdf | Bin 0 -> 12895 bytes tests/phpunit/tests/image/functions.php | 53 ++++++++++++++++++ 7 files changed, 163 insertions(+), 17 deletions(-) create mode 100644 tests/phpunit/data/images/wordpress-gsoc-flyer.pdf diff --git a/src/wp-admin/includes/image.php b/src/wp-admin/includes/image.php index 84e4c4c070..87b819180b 100644 --- a/src/wp-admin/includes/image.php +++ b/src/wp-admin/includes/image.php @@ -76,7 +76,9 @@ function wp_generate_attachment_metadata( $attachment_id, $file ) { $metadata = array(); $support = false; - if ( preg_match('!^image/!', get_post_mime_type( $attachment )) && file_is_displayable_image($file) ) { + $mime_type = get_post_mime_type( $attachment ); + + if ( preg_match( '!^image/!', $mime_type ) && file_is_displayable_image( $file ) ) { $imagesize = getimagesize( $file ); $metadata['width'] = $imagesize[0]; $metadata['height'] = $imagesize[1]; @@ -201,6 +203,44 @@ function wp_generate_attachment_metadata( $attachment_id, $file ) { } } } + // Try to create image thumbnails for PDFs + else if ( 'application/pdf' === $mime_type ) { + $editor = wp_get_image_editor( $file ); + + $fallback_sizes = array( + 'thumbnail', + 'medium', + 'large', + ); + + $sizes = array(); + + foreach ( $fallback_sizes as $s ) { + $sizes[$s]['width'] = get_option( "{$s}_size_w" ); + $sizes[$s]['height'] = get_option( "{$s}_size_h" ); + + // Force thumbnails to be soft crops. + if ( ! 'thumbnail' === $s ) { + $sizes[$s]['crop'] = get_option( "{$s}_crop" ); + } + } + + if ( ! is_wp_error( $editor ) ) { // No support for this type of file + $uploaded = $editor->save( $file, 'image/jpeg' ); + unset( $editor ); + + // Resize based on the full size image, rather than the source. + if ( ! is_wp_error( $uploaded ) ) { + $editor = wp_get_image_editor( $uploaded['path'] ); + unset( $uploaded['path'] ); + + if ( ! is_wp_error( $editor ) ) { + $metadata['sizes'] = $editor->multi_resize( $sizes ); + $metadata['sizes']['full'] = $uploaded; + } + } + } + } // Remove the blob of binary data from the array. if ( $metadata ) { diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index 1ccb9980d2..c79e312444 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -2766,7 +2766,17 @@ function edit_form_image_editor( $post ) { echo wp_video_shortcode( $attr ); - else : + elseif ( isset( $thumb_url[0] ) ): + + ?> +
+

+ +

+
+ image = new Imagick( $this->file ); + $this->image = new Imagick(); + $file_parts = pathinfo( $this->file ); + + // By default, PDFs are rendered in a very low resolution. + // We want the thumbnail to be readable, so increase the rendering dpi. + if ( 'pdf' == strtolower( $file_parts['extension'] ) ) { + $this->image->setResolution( 128, 128 ); + } + + // Reading image after Imagick instantiation because `setResolution` + // only applies correctly before the image is read. + $this->image->readImage( $this->file ); if ( ! $this->image->valid() ) return new WP_Error( 'invalid_image', __('File is not an image.'), $this->file); diff --git a/src/wp-includes/media-template.php b/src/wp-includes/media-template.php index c6699216e9..95fbb9ab4b 100644 --- a/src/wp-includes/media-template.php +++ b/src/wp-includes/media-template.php @@ -290,9 +290,9 @@ function wp_print_media_templates() {
<# if ( data.uploading ) { #>
- <# } else if ( 'image' === data.type && data.sizes && data.sizes.large ) { #> + <# } else if ( data.sizes && data.sizes.large ) { #> - <# } else if ( 'image' === data.type && data.sizes && data.sizes.full ) { #> + <# } else if ( data.sizes && data.sizes.full ) { #> <# } else if ( -1 === jQuery.inArray( data.type, [ 'audio', 'video' ] ) ) { #> @@ -454,6 +454,8 @@ function wp_print_media_templates() {
<# if ( data.image && data.image.src && data.image.src !== data.icon ) { #> + <# } else if ( data.sizes && data.sizes.medium ) { #> + <# } else { #> <# } #> diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index f6c5f0f294..ad733013af 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -183,9 +183,7 @@ function image_hwstring( $width, $height ) { * the image is an intermediate size. False on failure. */ function image_downsize( $id, $size = 'medium' ) { - - if ( !wp_attachment_is_image($id) ) - return false; + $is_image = wp_attachment_is_image( $id ); /** * Filters whether to preempt the output of image_downsize(). @@ -210,6 +208,19 @@ function image_downsize( $id, $size = 'medium' ) { $is_intermediate = false; $img_url_basename = wp_basename($img_url); + // If the file isn't an image, attempt to replace its URL with a rendered image from its meta. + // Otherwise, a non-image type could be returned. + if ( ! $is_image ) { + if ( ! empty( $meta['sizes'] ) ) { + $img_url = str_replace( $img_url_basename, $meta['sizes']['full']['file'], $img_url ); + $img_url_basename = $meta['sizes']['full']['file']; + $width = $meta['sizes']['full']['width']; + $height = $meta['sizes']['full']['height']; + } else { + return false; + } + } + // try for a new style intermediate size if ( $intermediate = image_get_intermediate_size($id, $size) ) { $img_url = str_replace($img_url_basename, $intermediate['file'], $img_url); @@ -685,6 +696,11 @@ function image_get_intermediate_size( $post_id, $size = 'thumbnail' ) { if ( is_array( $size ) ) { $candidates = array(); + if ( ! isset( $imagedata['file'] ) && isset( $imagedata['sizes']['full'] ) ) { + $imagedata['height'] = $imagedata['sizes']['full']['height']; + $imagedata['width'] = $imagedata['sizes']['full']['width']; + } + foreach ( $imagedata['sizes'] as $_size => $data ) { // If there's an exact match to an existing image size, short circuit. if ( $data['width'] == $size[0] && $data['height'] == $size[1] ) { @@ -738,7 +754,7 @@ function image_get_intermediate_size( $post_id, $size = 'thumbnail' ) { } // include the full filesystem path of the intermediate file - if ( empty($data['path']) && !empty($data['file']) ) { + if ( empty( $data['path'] ) && ! empty( $data['file'] ) && ! empty( $imagedata['file'] ) ) { $file_url = wp_get_attachment_url($post_id); $data['path'] = path_join( dirname($imagedata['file']), $data['file'] ); $data['url'] = path_join( dirname($file_url), $data['file'] ); @@ -3123,7 +3139,7 @@ function wp_prepare_attachment_for_js( $attachment ) { if ( current_user_can( 'delete_post', $attachment->ID ) ) $response['nonces']['delete'] = wp_create_nonce( 'delete-post_' . $attachment->ID ); - if ( $meta && 'image' === $type ) { + if ( $meta && ! empty( $meta['sizes'] ) ) { $sizes = array(); /** This filter is documented in wp-admin/includes/media.php */ @@ -3171,16 +3187,29 @@ function wp_prepare_attachment_for_js( $attachment ) { } } - $sizes['full'] = array( 'url' => $attachment_url ); + if ( 'image' === $type ) { + $sizes['full'] = array( 'url' => $attachment_url ); - if ( isset( $meta['height'], $meta['width'] ) ) { - $sizes['full']['height'] = $meta['height']; - $sizes['full']['width'] = $meta['width']; - $sizes['full']['orientation'] = $meta['height'] > $meta['width'] ? 'portrait' : 'landscape'; + if ( isset( $meta['height'], $meta['width'] ) ) { + $sizes['full']['height'] = $meta['height']; + $sizes['full']['width'] = $meta['width']; + $sizes['full']['orientation'] = $meta['height'] > $meta['width'] ? 'portrait' : 'landscape'; + } + + $response = array_merge( $response, $sizes['full'] ); + } elseif ( $meta['sizes']['full']['file'] ) { + $sizes['full'] = array( + 'url' => $base_url . $meta['sizes']['full']['file'], + 'height' => $meta['sizes']['full']['height'], + 'width' => $meta['sizes']['full']['width'], + 'orientation' => $meta['sizes']['full']['height'] > $meta['sizes']['full']['width'] ? 'portrait' : 'landscape' + ); } - $response = array_merge( $response, array( 'sizes' => $sizes ), $sizes['full'] ); - } elseif ( $meta && 'video' === $type ) { + $response = array_merge( $response, array( 'sizes' => $sizes ) ); + } + + if ( $meta && 'video' === $type ) { if ( isset( $meta['width'] ) ) $response['width'] = (int) $meta['width']; if ( isset( $meta['height'] ) ) diff --git a/tests/phpunit/data/images/wordpress-gsoc-flyer.pdf b/tests/phpunit/data/images/wordpress-gsoc-flyer.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d7e1799575faa87ec517fb62f5c548cef6bebcad GIT binary patch literal 12895 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 'application/pdf' ) ) ) { + $this->markTestSkipped( 'Rendering PDFs is not supported on this system.' ); + } + + $orig_file = DIR_TESTDATA . '/images/wordpress-gsoc-flyer.pdf'; + $test_file = '/tmp/wordpress-gsoc-flyer.pdf'; + copy( $orig_file, $test_file ); + + $attachment_id = $this->factory->attachment->create_object( $test_file, 0, array( + 'post_mime_type' => 'application/pdf', + ) ); + + $this->assertNotEmpty( $attachment_id ); + + $expected = array( + 'sizes' => array( + 'thumbnail' => array( + 'file' => "wordpress-gsoc-flyer-116x150.jpg", + 'width' => 116, + 'height' => 150, + 'mime-type' => "image/jpeg", + ), + 'medium' => array( + 'file' => "wordpress-gsoc-flyer-232x300.jpg", + 'width' => 232, + 'height' => 300, + 'mime-type' => "image/jpeg", + ), + 'large' => array( + 'file' => "wordpress-gsoc-flyer-791x1024.jpg", + 'width' => 791, + 'height' => 1024, + 'mime-type' => "image/jpeg", + ), + 'full' => array( + 'file' => "wordpress-gsoc-flyer.jpg", + 'width' => 1088, + 'height' => 1408, + 'mime-type' => "image/jpeg", + ), + ), + ); + + $metadata = wp_generate_attachment_metadata( $attachment_id, $test_file ); + $this->assertSame( $expected, $metadata ); + + unlink( $test_file ); + } }