【问题标题】:Issue saving PDF file using TCPDF使用 TCPDF 保存 PDF 文件问题
【发布时间】:2019-08-19 17:07:42
【问题描述】:

我想在单击按钮时将一些 html 保存到 pdf 文件。问题是我在ajax 通话后遇到了问题:

%PDF-1.7 %���� 8 0 obj > /Annots [ 6 0 R 7 0 R ] /PZ 1 >> endobj 9 0 obj 流 x��ۏ�q��� |�`ɐVU}���e).e�rI66�$^$�d3� �������]EYb�"I��g?ΙKwU���|�gy�s|r��o�������G���vqy|�]��H� ��������Q��F�D�S��F���@�.��'�}���e�8 �B�@����UH��@M�MC�g���P8���g[t���?P�#E���=��@�P��g KysL�m�.�0qC�{�[�}Tlg�kY�?����������3�K��9��g�%Mq��=���� 0vw��G�}����Obڃ�l�/��WC��|����?��O���y��u;��������L �_����qŁ�JG�ׇ��~���a?K�^���g��--�,�L3����?-�Z�e��W!1�D ����我#���s?

我在这里发现了类似的问题 - Tcpdf on Laravel 3 controller

但我不知道Response::make 是什么?任何想法如何解决它?谢谢。

代码:

jQuery/Ajax

$(document).on("click", "#testButtonClick", function() {
   savePDF($("#test").html(), "Test1", "Test2");
 });

function savePDF(info, name, data) {
$.ajax({
    type: "post",
    url: "includes/worker",
    data: {"test": info, "name": name, "data": data},
    xhr: function() {
        try {
            if (window.ActiveXObject) {
                return new window.ActiveXObject("Microsoft.XMLHTTP");
            }
        } catch(e) { }

        return new window.XMLHttpRequest();
    },
    success: function(result) {
        console.log(result);
    },
    error: function(response) {
    }
}); 
}

PHP

    require_once("tcpdf.php");
    $pdfData = new TCPDF('P', PDF_UNIT, PDF_PAGE_FORMAT, true, "UTF-8", false);  //
    $pdfData->SetCreator("Test..");  
    $pdfData->SetTitle("Test..");  
    $pdfData->SetHeaderData("", "", PDF_HEADER_TITLE, PDF_HEADER_STRING);  
    $pdfData->setHeaderFont(Array(PDF_FONT_NAME_MAIN, "", PDF_FONT_SIZE_MAIN));  
    $pdfData->setFooterFont(Array(PDF_FONT_NAME_DATA, "", PDF_FONT_SIZE_DATA));  
    $pdfData->SetFooterMargin(PDF_MARGIN_FOOTER);  
    $pdfData->SetMargins(PDF_MARGIN_LEFT, "5", PDF_MARGIN_RIGHT);  
    $pdfData->setPrintHeader(false);  
    $pdfData->setPrintFooter(false);  
    $pdfData->SetAutoPageBreak(true, 10);  
    $pdfData->setFontSubsetting(true);
    $pdfData->AddPage();
    $pdfData->SetFont("freeserif", "", 10);
    $pdfData->writeHTML(iconv("Windows-1251", "UTF-8", "Это тест...."));  
    $pdfData->Output("Test.pdf", "D");

【问题讨论】:

  • 这是 PDF...
  • @LarsStegelitz 是的,我知道,但它应该显示对话框来保存它,而不是输出为文本/html。有任何想法吗?谢谢。
  • 如果浏览器应该提供另存为对话框,您需要设置适当的标题(Content-Disposition)。如果您通过 AJAX 接收数据,我不确定这是否可行...
  • @LarsStegelitz 我知道,但它不起作用。我尝试将contentType 添加到ajax,也将标头添加到php。我很快就会在我的帖子中添加代码。
  • 您尝试了 application/force-download mime 标头吗?

标签: php ajax pdf tcpdf


【解决方案1】:

所以,我通过使用自动表单JS 和转义字符(例如")来修复它。

代码:

    var pdfForm = $("<form action=\"includes/worker\" method=\"post\" enctype=\"multipart/form-data\" target=\"_blank\"></form>");
      pdfForm.append("<input type=\"hidden\" name=\"test\" value=\"" + htmlValidation($("#test").html()) + "\">");
      pdfForm.append("<input type=\"hidden\" name=\"name\" value=\"Test1\">");
      pdfForm.append("<input type=\"hidden\" name=\"data\" value=\"Test2\">");
      $("body").append(pdfForm);
      $(pdfForm).submit();

   function htmlValidation(data) {
     return data
       .replace(/&/g, "&amp;")
       .replace(/</g, "&lt;")
       .replace(/>/g, "&gt;")
       .replace(/"/g, "&quot;")
       .replace(/'/g, "&#039;");
   }

【讨论】:

  • 可能问题在于您需要在 JavaScript 代码中将响应转换为 blob 对象。
  • @pippo 谢谢提示,我会尝试使用Ajax 方法,稍后回复。
  • @pippo 我试过了:var pdfBlob = new Blob([result], {type: "application/pdf;charset=utf-8"}); saveAs(pdfBlob, "test.pdf"); 但它将pdf 保存为空(空白)文件。谢谢。
  • 我不得不做类似的事情,我发现这篇文章nehalist.io/downloading-files-from-post-requests 非常有帮助:)
  • @pippo 也许我稍后会尝试。感谢您的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2016-01-04
  • 2011-04-15
相关资源
最近更新 更多