Злой PDF не совершает AJAX / JS звонков - PullRequest
1 голос
/ 22 января 2020

В настоящее время я использую JS и Ajax запросы для редактирования некоторых тегов HTML в зависимости от результатов определенного метода контроллера. Это все работает нормально, пока я не хочу создать PDF, я провел некоторые исследования и нашел несколько «решений» для этого, используя javascript_delay и window-status , но безуспешно .

Следуя руководству wkhtmltopdf Я использую wicked_pdf_javascript_include_tag для загрузки файла JS, и это записывается и сохраняется, но я не знаю, если Javascript выполняется, поскольку «визуальная» часть создается в части AJAX файла. js, который не отображается в PDF.

Контроллер возвращает полный HTML что я хочу визуализировать в HTML контейнере:

$.ajax({
  url: "/monitor/device/"+widget.property.device_sensor,
  type: 'GET',
  dataType: 'html'
}).done(function (datos) {
  $container.html(datos);
}).always(function () {
  redBorder.widgets.util.reloadDone($container.parents('.widget'));
});

Это использует GEM wkhtmltopdf в Rails

Как я могу узнать, что JS выполняется, и если он выполняется, и проблема связана с вызовом AJAX, как это можно исправить?

Ответы [ 2 ]

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

Во время рендеринга с wicked-pdf страница сохраняется во временный файл на диске и открывается по протоколу file://. В результате страница ничего не знает об адресе вашего сервера, и даже если она и знает - она ​​будет иметь другое происхождение, что по умолчанию предотвращает вызовы ajax (для этого необходимо настроить CORS).

Для PDF-файлов Лучше избавиться от вызовов ajax, потому что, очевидно, не будет никакого взаимодействия с пользователем, и вы сможете просмотреть все необходимые данные.

0 голосов
/ 24 января 2020

Попробуйте что-то вроде этого:

var httpRequest;
    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
      httpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
      try {
        httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e) {
        try {
          httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {}
      }
    }
    if (!httpRequest) {
      alert('Giving up :( Cannot create an XMLHTTP instance');
      return false;
    }
    httpRequest.open('GET', url);
    httpRequest.withCredentials = true;
    httpRequest.responseType = 'text';
    httpRequest.onreadystatechange = function(){
      if (httpRequest.readyState === 4) {
        /do stuff
      }
    };
    httpRequest.send();

Это заменит вызов ajax на чистый javascript. Надеюсь, это помогло, Педро.

...