Сохраните сгенерированный файл PDF на сервере с jsPDF и PHP - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь сохранить сгенерированный PDF-файл с плагином JSPDF на сервере, а не сохранять его на стороне клиента, часть javascript, которая обрабатывает JsPDF, выглядит так:

<script type="text/javascript">

(function(){
 var 
form = $('.form'),
cache_width = form.width(),
//cache_height = form.height(),
a4  =[ 595.28,  841.89];  // for a4 size paper width and height

$('#create_pdf').on('click',function(){
$('body').scrollTop(0);
createPDF();
 });
//create pdf
function createPDF(){
getCanvas().then(function(canvas){
    var 
    img = canvas.toDataURL("image/png"),

    doc = new jsPDF({
      unit:'px', 
      format:'a4'
    });     

 var imgWidth = 220;
 var pageHeight = 295;  
 var imgHeight = canvas.height * imgWidth / canvas.width;
 var heightLeft = imgHeight;

 var doc = new jsPDF('p', 'mm');
 var position = 0;

 doc.addImage(img, 'PNG', 0, position, imgWidth, imgHeight);
 heightLeft -= pageHeight;

 while (heightLeft >= 0) {
    position = heightLeft - imgHeight;
    doc.addPage();
    doc.addImage(img, 'PNG', 0, position, imgWidth, imgHeight);
    heightLeft -= pageHeight;
   }

 var blob = doc.output('blob');
 var formData = new FormData();
 formData.append('pdf', blob);
  $.ajax({
url: 'upload.php', 
type: 'POST',
data: formData,
dataType: 'text',
cache: false,
processData: false,
contentType: false,
success: function(response){
alert(response); 
console.log(response)
 },
   error: function(err){
         alert(err);
        console.log(err)
  }
 });

});
  }

// create canvas object
    function getCanvas(){
      form.width((a4[0]*1.33333) -80).css('max-width','none');
      return html2canvas(form,{
       imageTimeout:2000,
       removeContainer:true
       });  
     }

  }());

 </script>

upload. php файл должен переместить сгенерированный pdf-файл или его содержимое в папку Uploads, но кажется, что $ _FILES ['data'] пусто

   <?php
    if(!empty($_FILES['data'])) {
// PDF is located at $_FILES['data']['tmp_name']

$content = file_get_contents($_FILES['data']['tmp_name']);
//echo $content;
$location = "uploads/";
move_uploaded_file($_FILES['data']['tmp_name'], $location.'random-name.pdf');

  } else {
throw new Exception("no data");
  }

ответ, который я получаю от Ajax это «Примечание: неопределенный индекс: данные». Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 28 января 2020

Я наконец заставил его работать, используя этот код:

var pdf = btoa(doc.output()); 

    var file_name = $('#id').val();
    //var file_name = 'hello world';
        $.ajax({
          method: "POST",
          url: "upload.php",
          data: {data: pdf, filename: file_name},
        }).done(function(data){
        //   alert(data);
           console.log(data);
        }); 

и на стороне сервера загрузку. php вот так:

if(!empty($_POST['data'])){
 $data = base64_decode($_POST['data']);

 $fileName = $_POST['filename'];

 file_put_contents( "uploads/".$fileName.".pdf", $data );
 } else {
 echo "No Data Sent";
 }
 exit();
...