如何为PDF上传创建缩略图?

时间:2013-11-07 作者:Andrew

我正在开发一个网站,需要允许用户在Gravity表单中提交PDF文件,并创建PDF第一页的JPG缩略图,然后显示在创建的帖子中。

我的计划是要有一个允许这样做的功能,并将JPG链接添加到自定义字段,这样它就可以显示在帖子页面上。

不幸的是,虽然我理解这个概念,并且有一个脚本我用来在非Wordpress网站中将PDF转换为JPG格式,但我不确定如何在Wordpress中实现这一点,或者是否最好将其创建为插件而不是函数。

有没有人能为我从这个概念开始提供一些指导?

CODE:作为参考,这里是我从之前的脚本中获得的代码的特定部分,但它大约有6年的历史了:

function make_thumbs($uploadedFpId,$issueFileprefix) {
    $issuePathprefix = $_SERVER[\'DOCUMENT_ROOT\'].\'/fp/\'.$issueFileprefix;
    exec(\'convert -colorspace RGB -density 100x100 \'.$issuePathprefix.\'.pdf[0] -quality 90 \'.$issuePathprefix.\'.jpg\');
    exec(\'convert \'.$issuePathprefix.\'.jpg  -resize 100x146 \'.$issuePathprefix.\'_sm.jpg\'); // make thumbnail
    exec(\'convert \'.$issuePathprefix.\'.jpg  -resize 500x1000 \'.$issuePathprefix.\'.jpg\'); // make correct size of preview
}
UPDATE:我找到了以下代码(right here) , 这似乎进一步指向了正确的方向。问题是,我仍然不知道如何在上传后立即处理这个问题,还需要拉入上传的文件路径,然后我仍然需要将其保存到post自定义字段:

$img = wp_get_image_editor( ‘my/temp/uploads/path/mypdf.pdf’ );
$img->resize( 50, 50, true );
$filename = $img->generate_filename( ‘thumb’, ‘wp/wp-content/uploads/thumbs/’, ‘jpg’ );
$img->save($filename, ‘image/jpeg’);

1 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

如果我没有完全弄错的话,您在更新中提供的代码将不起作用,因为WP_image_editor class 呼叫人wp_get_image_editor(). 不过,可以通过上传的pdf文件创建缩略图。

下面的代码为您提供了一种可能的解决方法,我对所有重要的事情进行了评论,以便您更好地理解。通过挂接到wp_generate_attachment_metadata 这个hookfunction 以及检查上载文件的mime类型。

Code:

add_filter( \'wp_generate_attachment_metadata\', \'wpse121600_create_pdf_thumbnail\', 10, 2 );
function wpse121600_create_pdf_thumbnail( $metadata, $attachment_id ) {

    //Get the attachment/post object
    $attachment_obj = get_post( $attachment_id );

    //Check for mime type pdf
    if( \'application/pdf\' == get_post_mime_type( $attachment_obj ) ) {

        //Get attachment URL http://yousite.org/wp-content/uploads/yourfile.pdf
        $attachment_url = wp_get_attachment_url($attachment_id);
        //Get attachment path /some/folder/on/server/wp-content/uploads/yourfile.pdf
        $attachment_path = get_attached_file($attachment_id );

        //By adding [0] the first page gets selected, important because otherwise multi paged files wont\'t work
        $pdf_source = $attachment_path.\'[0]\';

        //Thumbnail format
        $tn_format = \'jpg\';
        //Thumbnail output as path + format
        $thumb_out = $attachment_path.\'.\'.$tn_format;
        //Thumbnail URL
        $thumb_url = $attachment_url.\'.\'.$tn_format;

        //Setup various variables
        //Assuming A4 - portrait - 1.00x1.41
        $width = \'250\';
        $height = \'353\';
        $quality = \'90\';
        $dpi = \'300\';
        $resize = $width.\'x\'.$height;
        $density = $dpi.\'x\'.$dpi;

        //For configuration/options see: http://www.imagemagick.org/script/command-line-options.php
        $a_exec = "convert -adaptive-resize $width -density $dpi -quality $quality $pdf_source $thumb_out";
        $r_exec = "convert -resize $width -density $dpi -quality $quality $pdf_source $thumb_out";
        $t_exec = "convert -thumbnail $width -density $dpi -quality $quality $pdf_source $thumb_out";
        $s_exec = "convert -scale $width $pdf_source $thumb_out";

        //Create the thumbnail with choosen option
        exec($r_exec);

        //Add thumbnail URL as metadata of pdf attachment
        $metadata[\'thumbnail\'] = $thumb_url;

    }

    return $metadata;

}
当然,这并不能满足您对插件的所有愿望,但它应该让您开始。例如,该代码可以与创建缩略图的另一种方法一起使用,即引用我在评论中发布的链接。除此之外,还有一些其他功能是可以想象的,比如将缩略图插入媒体库,但这只是给你一个展望。

结束

相关推荐

private functions in plugins

我开发了两个插件,其中一个功能相同(相同的名称,相同的功能)。当试图激活两个插件时,Wordpress会抛出一个错误,因为它不允许我以相同的名称定义函数两次。有没有一种方法可以使这个函数只对插件私有,而不使用面向对象编程,也不简单地重命名函数?我不想使用OOP,因为我首先要学习它。此外,我不想重命名该函数,因为我可能也想在其他插件中使用它,而重命名感觉不太合适。