使用PHP DOMPDF和 AJAX 下载PDF文件

8mmmxcuj  于 2022-12-10  发布在  PHP
关注(0)|答案(3)|浏览(229)

我有这个PHP文件名为print.php:

<?php
require_once("modules/pdf/dompdf_config.inc.php");
$html = $_POST["toRender"];
$number = $_POST["number"];
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
$dompdf->stream($number.".pdf");

如您所见,HTML和Number是通过POST接收的。
JavaScript文件如下所示:

$("#btnViewPDF").click(function() {

        var theHtml = $("#printable").html();
        var theNumber = $("#invoiceNumber").val();

        $.ajax({
            type : "post",
            url  : "views/print.php",
            data : {toRender : theHtml, number : theNumber},
            beforeSend: function() {
                $(".ajax-loader-bg").fadeIn();
            }
        }).always(function() {
            $(".ajax-loader-bg").fadeOut();
        });
        return false;
    });

基本上,它需要一个名为“可打印”的DIV中的所有内容,但我接下来想要的是在print.php中生成的PDF文件,我还没有能够弄清楚我如何才能做到这一点。
当我在print.php中生成测试HTML,然后输入url www.example.com时,它就可以工作mysite.com/print.php......它会呈现PDF,并允许我下载它或在另一个浏览器选项卡中查看它。
如何通过 AJAX 实现这一点?

ibps3vxo

ibps3vxo1#

你不能通过 AJAX 下载一些东西,你可以使用一个隐藏的iframe来模拟行为。
不是说你不能下载它,但是,它永远不会结束在文件系统中保存的目的,因为javascript不能这样做的安全原因。
反正人总会找到解决办法的,你可以试试这个:https://stackoverflow.com/a/23797348/1131176

fkaflof6

fkaflof62#

我确实做到了这一点,通过一个技巧,这个例子是在codeigniter中制作的,所以你可以修改它,首先, AJAX 方法:

$.ajax({
    url: base_url+"controladorapr/exportComprobanteIngresos", //method i called
    data: $(this).serialize() //i serialized data from a form,
type:"POST",
    dataType: 'JSON',
    success: function (data) {
  //create a link to download the pdf file
  var link=document.createElement('a');
  //i used the base url to target a file on mi proyect folder
  link.href=window.URL = base_url+"exportacion.pdf";
  //download the name with a different name given in the php method
  link.download=data.nombre_archivo;
  link.click();
  //this js function hides the loading gif i use
  hideLoad();
    }
});

现在,让我们转到我的控制器上的方法:

function exportComprobanteIngresos(){
   //receive your ajax data
   $fecha = $this->input->post("fecha_comprobante_ingresos");
   $fecha = date_format(DateTime::createFromFormat('d/m/Y', $fecha), "Y-m-d");
   //send data to pdf
   $data["fecha"] = $fecha;

   //do some query here to send data and save it into $data[] array

   //pdf size
   $tamaño = 'A4';
   //create a file name
   $nombre_archivo = "Comprobante_ingresos".date_format(DateTime::createFromFormat('Y-m-d', $fecha), "Y_m_d").".pdf";
   //load dompdf method, i will show this later, and send the data from db and file name
   $pdf = $this->pdf->load_view("pdf/comprobanteIngresos", $data, $tamaño, $nombre_archivo);
   //save the pdf content into the file we are downloading
   file_put_contents('exportacion.pdf', $pdf);
   //send data back to javascript
   $data2["nombre_archivo"] = $nombre_archivo;
   echo json_encode($data2);

}
现在,我们将包括dompdf,要在codeigniter上使用dompdf,请参阅以下答案:Codeigniter with dompdf
下面是我在函数'$this-〉pdf-〉load_view'中使用的dompdf中的代码:

$dompdf = new Dompdf();
 $html = $this->ci()->load->view($view, $data, TRUE);

 $dompdf->loadHtml($html);

 // (Optional) Setup the paper size and orientation
 $dompdf->setPaper($size, 'portrait');

 // Render the HTML as PDF
 $dompdf->render();

 // Output the generated PDF to variable and return it to save it into the file
 $output = $dompdf->output();
 return $output;

现在有了这个,我设法使用 AJAX 与dompdf,并把一个加载gif到它,它的工作很好,到最后,你加载的php文件'$this-〉pdf-〉load_view'没有一个头或其他,是纯粹的html和php,希望这有助于!

z6psavjg

z6psavjg3#

用**方法解决了符号处理问题,得到();**开发JQuery
代码JavaScript/JQuery,忽略参数“id_convenio”,我现在使用MySQL作为将来的参考

$.get('../models/convenio_pdf.php', {id_convenio: idConvenio}, function (response) {
    // Este método prop de JQuery es por si lo embebes en un <iframe>
    // $('#iframe_pdf').prop('src', `data:application/pdf;base64,${response}`);

    // El siguiente codigo es para descargar directo el PDF desde el navegador
    const link = document.createElement('a');
    link.setAttribute('href', `data:application/pdf;base64,${response}`);
    link.download = `Convenio_PayBoard_${idConvenio}.pdf`;
    link.click();
});

脚本PHP,有一部分的网络应用程序可以安装和示例化DOMPDFComposer

<?php
require('../vendor/autoload.php');
use Dompdf\Dompdf;
$dompdf = new Dompdf();
$dompdf->loadHtml('Seré un PDF');
$dompdf->render();
echo base64_encode($dompdf->output());

相关问题