从href自动下载生成的pdf

时间:2020-02-26 09:00:41

标签: php pdf download

我真的很沮丧,我对此没有解决方案。

我在php中有以下代码。

我想要的是生成的pdf,该链接在生成链接后自动点击下载时可用。

如您所见,我已经尝试了一些方法,但是我不明白。

总结

我希望单击此链接pdf后显示的<a href="'.get_home_url().'/?dpd_id='.$label_number.'" download>Click here to download PDF</a>文件无需单击即可自动下载。

有人可以帮我吗?

// Make the action from selected orders
add_filter( 'handle_bulk_actions-edit-shop_order', 'dpd_handle_bulk_generate_labels', 10, 3 );
function dpd_handle_bulk_generate_labels( $redirect_to, $action, $post_ids ) {
    if ( $action !== 'dpd_bulk_create_label' )
        return $redirect_to; // Exit

    global $attach_download_dir, $attach_download_file; // ???

    $success_ids = array();
    $failed_ids = array();

    $messages = array();
    echo "<br>Post ID: ";
    echo "<PRE>";
    print_r($post_ids);
    echo "</PRE>";

    foreach ( $post_ids as $post_id ) {

        $response_error = create_label($post_id, 'return');
        if(!$response_error)
            {
                $success_ids[] = $post_id;  
            }
        else
            {
                $failed_ids[] = $post_id;   
            }

        $order = wc_get_order( $post_id );
        $order_data = $order->get_data();

        // Your code to be executed on each selected order
        fwrite($myfile,
            $order_data['date_created']->date('d/M/Y') . '; ' .
            '#' . ( ( $order->get_type() === 'shop_order' ) ? $order->get_id() : $order->get_parent_id() ) . '; ' .
            '#' . $order->get_id()
        );
        $processed_ids[] = $post_id;
        $messages[] = "Generated Shipping Label for Order ID: ".$post_id;
    }
    $msg = implode("<br>", $messages);
    echo "<br>MSG: ".$msg;
    new DPD_notify( $msg, "notice notice-success" );
//exit;
    return $redirect_to;
    return $redirect_to = add_query_arg( array(
        'write_downloads' => '1',
        'sids' => implode( ',', $success_ids ),
        'fids' => implode( ',', $failed_ids ),
    ), $redirect_to );
}
$ch = curl_init();
$source = "'.get_home_url().'/?dpd_id='.$label_number.'";
curl_setopt($ch, CURLOPT_URL, $source);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec ($ch);
curl_close ($ch);

$destination = "'download.pdf";
$file = fopen($destination, "w+");
fputs($file, $data);
fclose($file);

function dpd_label_on_order_status_completed( $order_id ) 
    { 
        $auto_generate_shipping_label = ice_get_option( 'dpd_auto_generate_shipping_label_oc', 'dpd_options' );
        if($auto_generate_shipping_label)   create_label($order_id, 'return');
    }
add_action( 'woocommerce_order_status_completed', 'dpd_label_on_order_status_completed', 10, 1 ); 

function get_order_shipping_label_number($order_id)
    {
        $label_number = 0;
        if($order_id)
            {
                global $wpdb;
                $table_name = $wpdb->prefix.'dpd_orders';
                $parcels = $wpdb->get_results("SELECT id, parcel_number, date FROM $table_name WHERE order_id = $order_id AND (order_type != 'amazon_prime' OR order_type IS NULL ) AND status !='trash'");
                if( count ( $parcels ) > 0 ) {
                    if(isset($parcels[0]->id)) {
                        $label_number = $parcels[0]->id;    
                    }
                }   
            }
        return $label_number;
    }

// The results notice from bulk action on orders
add_action( 'admin_notices', 'downloads_bulk_action_admin_notice' );
function downloads_bulk_action_admin_notice() {
    $success_ids = '';  if(isset($_REQUEST['sids']))    $success_ids = $_REQUEST['sids'];
    $failed_ids = '';   if(isset($_REQUEST['fids']))    $failed_ids = $_REQUEST['fids'];

    if($success_ids)
        {
            echo '<div class="notice notice-success"><br>';
            echo "Successfully generated label for the following Orders: ";
            $success_ids_array = explode(",", $success_ids);
            if(is_array($success_ids_array) and sizeof($success_ids_array))
                {
                    foreach($success_ids_array as $success_id)
                        {
                            $label_number = get_order_shipping_label_number($success_id);
                            echo '<br>Order ID: '.$success_id.' - <a href="'.get_home_url().'/?dpd_id='.$label_number.'" download>Click here to download PDF</a>;

                        }
                }
    if($failed_ids)
        {
            echo "<br>Failed generating Labels for following Order numbers: ".$failed_ids;
        }
}

function dpd_wc_add_label_pdf_column_header( $columns ) {
    $new_columns = array();
    foreach ( $columns as $column_name => $column_info ) {
        $new_columns[ $column_name ] = $column_info;
        if ( 'order_total' === $column_name ) {
            $new_columns['shipping_label'] = __( 'Shipping Label', 'my-textdomain' );
        }
    }
    return $new_columns;
}
add_filter( 'manage_edit-shop_order_columns', 'dpd_wc_add_label_pdf_column_header', 20 );

function dpd_wc_add_label_pdf_column_content( $column ) {
    global $post;
    if ( 'shipping_label' === $column ) {
        $label_number = get_order_shipping_label_number($post->ID);
        if($label_number)   echo '<a href="'.get_home_url().'/?dpd_id='.$label_number.'" target="_blank">Download PDF</a>'.trigger("click");
file_put_contents("download.pdf", fopen("'.get_home_url().'/?dpd_id='.$label_number.'", 'r'));
    }
}
add_action( 'manage_shop_order_posts_custom_column', 'dpd_wc_add_label_pdf_column_content' );
?>

1 个答案:

答案 0 :(得分:1)

首先,您需要在生成的PDF文件上设置Content-Disposition: Attachment HTTP标头。为此,您将需要修改PDF生成代码。否则,以下方法只会导致显示PDF(不会自动下载)。

完成后,像这样在HTML <head>标记中链接到生成的PDF文件:

<meta http-equiv="refresh" content="0; url=<?= get_home_url().'/?dpd_id='.$label_number ?> />

如果PDF的路径是相对路径,请在url=字段中的URL前面加上./

请确保以某种方式验证label_number参数,否则您的应用程序将容易受到未经验证的重定向安全漏洞的攻击。我还建议您在页面中的某个位置保留指向PDF文件的链接,以防由于某种原因下载无法自动开始。

另请参阅How to force a pdf download automatically?Meta refresh download (txt, ini, css or html) file