0

我正在使用高级自定义字段插件(免费版)将 3 个不同的 pdf 文件附加到单个帖子。

在模板上显示帖子列表后,单击按钮我正在发出 AJAX 请求以获取所有显示帖子的文件。

由于每个帖子都有 3 个 PDF 文件,我想将所有帖子的所有这些文件合并为一个 PDF 文件并下载该单个文件。

到目前为止我做了什么:

单击按钮时的 AJAX 请求:

    function merklisteDownload() {
        window.event.preventDefault()
        var m = JSON.parse(window.sessionStorage.getItem('merkliste_items')) || []
        var ids = []
        if (m.length > 0) {
            m.forEach(element => {
                ids.push(element.id)
            });
        }
        $.ajax({
            type: 'POST',
            url: '<?php echo admin_url('admin-ajax.php'); ?>',
            dataType: "json",
            data: {
                action: 'get_post_files',
                ids: ids
            },
            success: function(response) {
                console.log(response.data)
            },
            error: function(error) {
                console.log(error)
            }
        });
    }

和 admin-ajax.php 代码:

    function get_post_files(){
    $data = [];
    foreach ($_POST['ids'] as $post_id) {
        array_push($data, [
            'id'                        => $post_id,
            'title'                     => get_the_title($post_id),
            'category'                  => get_the_category($post_id)[0]->name,
            'front_image'               => get_field('front_image', $post_id)['sizes']['large'] == true ? get_field('front_image', $post_id)['sizes']['large'] : null,
            'back_image'                => get_field('back_image', $post_id)['sizes']['large'] == true ? get_field('back_image', $post_id)['sizes']['large'] : null,
            'technische_daten'          => get_field('technische_daten', $post_id)['url'], //file
            'lichttechnische_parameter' => get_field('lichttechnische_parameter', $post_id)['url'], //file
            'reach_zertifikat'          => get_field('reach-zertifikat', $post_id)['url'],  //file
        ]);
    }
    wp_send_json_success($data);
    wp_die();
}

add_action('wp_ajax_get_post_files', 'get_post_files');
add_action('wp_ajax_nopriv_get_post_files', 'get_post_files');

到目前为止一切正常,我能够获取每个帖子的文件 URL,但我不知道如何将这些文件合并为一个并将文件作为 AJAX 响应返回,然后下载该文件。

有什么帮助吗?

此致。

4

1 回答 1

0

这是一个选项,可能会为您指明合并文件的正确方向:https ://orangeable.com/php/pdf-merge

它可能看起来像这样:

function get_post_files(){
    $data = [];
    foreach ($_POST['ids'] as $post_id) {
        array_push($data, [
            'id'                        => $post_id,
            'title'                     => get_the_title($post_id),
            'category'                  => get_the_category($post_id)[0]->name,
            'front_image'               => get_field('front_image', $post_id)['sizes']['large'] == true ? get_field('front_image', $post_id)['sizes']['large'] : null,
            'back_image'                => get_field('back_image', $post_id)['sizes']['large'] == true ? get_field('back_image', $post_id)['sizes']['large'] : null,
            'technische_daten'          => get_field('technische_daten', $post_id)['url'], //file
            'lichttechnische_parameter' => get_field('lichttechnische_parameter', $post_id)['url'], //file
            'reach_zertifikat'          => get_field('reach-zertifikat', $post_id)['url'],  //file
        ]);
        $temp = array(
            $data['technische_daten'],
            $data['lichttechnische_parameter'],
            $data['reach_zertifikat']
        );
        file_put_contents(getcwd() . "\\pdf\\merged-".$post_id.".pdf", "");
        $command = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=" . getcwd() . "\\pdf\\merged-".$post_id.".pdf "; // needs space at end
        foreach($temp as $file) {
            $command .= getcwd() . "\\pdf\\" . $file . " ";
        }
        $command .= "2&>1";
        $data['merged_file'] = shell_exec($command);
    }
    wp_send_json_success($data);
    wp_die();
}

add_action('wp_ajax_get_post_files', 'get_post_files');
add_action('wp_ajax_nopriv_get_post_files', 'get_post_files');
于 2022-02-12T23:56:41.550 回答