Поскольку вы утверждаете, что PDF возвращается, когда вы вызываете это:
http://localhost:8081/exist/apps/deheresi/download?doc=MS609-0002.pdf&lang=EN
Возможно, вам следует обработать этот ответ.Простой пример был бы в jQuery с использованием FileSaver.js.(Вы можете google FileSaver.js и скачать и включить его на своих страницах с помощью jQuery):
function preview_cover(path){
var pdffilename="cover.pdf";
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (this.readyState == 4 && this.status == 200){
saveAs(this.response, pdffilename);
}}
xhr.open('GET', 'cover-formatter.xq?cover=' + path + '&page_width=' + page_width + '&page_height=' + page_height);
xhr.setRequestHeader('Authorization','Basic ' + sessinfo);
xhr.responseType = 'blob';
xhr.send();
}
Приведенный выше пример загрузит PDF-файл с использованием современных браузеров (Chrome, Firefox, Edge).
Код, стоящий за этим (я отбросил все остальные вещи, просто оставив часть форматирования):
let $fo := if ($territory = 'WALES') then util:expand(transform:transform($doc, doc("/db/EIDO/data/edit/xsl/EIDOcoverbilingual.xsl"), $parameters))
else util:expand(transform:transform($doc, doc("/db/EIDO/data/edit/xsl/EIDOcover.xsl"), $parameters))
let $pdf := xslfo:render($fo, "application/pdf", (), $config)
let $headers := response:set-header("Content-Disposition", "attachment;filename=document.pdf")
return
response:stream-binary($pdf, "media-type:application/pdf","document.pdf")
Ниже приведен более длинный код jQuery Javascript, который пытается обработать ответ на стороне Javascript,Следует отметить несколько уловок, которые я упомяну в первую очередь, чтобы понять.Один из них заключается в том, что браузеры iOS или IE9 не могут обрабатывать двоичные загрузки в браузере.Таким образом, серверный код на самом деле имеет хак для создания PDF, и если браузер iE9 или iOS, он сохраняет результат в БД (или AWS S3) и возвращает ссылку на этот PDF, чтобы его можно было «щелкнуть»смотреть.Другие распространенные браузеры могут автоматически обрабатывать двоичные данные, отправленные обратно, если все сделано правильно.Для этого мы используем плагин FileSaver.js Javascript, который будет загружать PDF.
Другие части, которые вы можете откровенно игнорировать.Как и logEvent, который отправляет событие в Google Analytics, переменная totformats отслеживает загрузки пользователей и ограничивает их за один сеанс.Взлом для загрузки Chrome, вероятно, не требуется, поскольку это было ошибкой в Chrome для Android.добавление и загрузка классов загрузчика для графического интерфейса.Решение iE9, iOS, использующее IP в качестве установленной переменной, это потому, что база данных реплицируется и сбалансирована нагрузка во многих странах, и поскольку данные записываются в БД для этого одного вызова, нам нужен IP-адрес этого точного сервера.в этом есть результат.С интеграцией S3 это исчезнет.
По сути, ключ заключается в том, что он вызывает тот же URL-адрес, что и при сохранении ответа, используя:
saveAs(this.response, pdffilename);
Это вызов в FileSaver.js, которыйпозволяет сохранять двоичные данные из XHR GET и загружать их для вас.Я извлек это из гораздо большего кода, который обрабатывает все загрузки, включая динамически сгенерированные из RenderX, как у вас, но также и статические PDF-файлы.
Вызов простой, просто GET для клиента-форматера.xq, который в моем случае совпадает с вызовом http://localhost/customer-formatter.xq (потому что я убираю / существую и мой пост для Jetty равен 80):
xhr.open('GET', 'customer-formatter.xq?masterlang=' + masterlang + '&doclang=' + doclang + '&specialty='+ specialty + '&article=' + docnum + '&user_name=' + loggedInUser + '&territory=' + territory + '&expiry=' + expiry + '&page_width=' + page_width + '&page_height=' + page_height + '&column_count=' + column_count + '&phrasechange=' + phrasechange + '&genlink=' + genlink + '&access=' + access + '&scalefont=' + scalefont + '&skin=' + skin + '&watermark=' + watermarkmsg +'×tamp=' + timestamp);
totformats++;
if (totformats > maxformats)
window.location.href = '/user?logout=logout';
var docfilename = ((doclang) ? doclang : '') + ((doctype) ? doctype : '');
var pdffilename = docnum + '-' + docfilename + '.pdf';
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (this.readyState == 4 && this.status == 200){
// Do IE9 stuff or iPhone/iPad
if (version == 9) {
var ip = this.responseText;
var a = document.createElement("a");
a.style = "cursor: pointer;";
document.body.appendChild(a);
var url = 'http://' + ip + '/IE9/' + loggedInUser + '-' + docnum + '-English.pdf';
a.href = url;
$(a).attr('target','_blank');
a.click();
$(a).remove();
$(doc).removeClass('loader');
$(doc).prop('disabled',false);
}
else if (isiOS) {
var ip = this.responseText.trim();
ioswindow.location.href = 'http://' + ip + '/IE9/' + loggedInUser + '-' + docnum + '-English.pdf';
$(doc).removeClass('loader');
$(doc).prop('disabled',false);
}
// Hack to partially fix Chrome error, file is now in Chrome downloads
else if (Math.max(document.documentElement.clientWidth, window.innerWidth || 0) <= 1024 && window.chrome) {
var blob = new Blob([this.response], {type: 'application/pdf'});
var a = document.createElement("a");
a.style = "display: none";
document.body.appendChild(a);
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = pdffilename;
a.click();
window.URL.revokeObjectURL(url);
$(doc).removeClass('loader');
$(doc).prop('disabled',false);
}
else {
saveAs(this.response, pdffilename);
$(doc).removeClass('loader');
$(doc).prop('disabled',false);
}
}
}
xhr.open('GET', 'customer-formatter.xq?masterlang=' + masterlang + '&doclang=' + doclang + '&specialty='+ specialty + '&article=' + docnum + '&user_name=' + loggedInUser + '&territory=' + territory + '&expiry=' + expiry + '&page_width=' + page_width + '&page_height=' + page_height + '&column_count=' + column_count + '&phrasechange=' + phrasechange + '&genlink=' + genlink + '&access=' + access + '&scalefont=' + scalefont + '&skin=' + skin + '&watermark=' + watermarkmsg +'×tamp=' + timestamp);
xhr.setRequestHeader('Authorization','Basic ' + sessinfo);
if (isiOS)
xhr.responseType = 'text';
else
xhr.responseType = 'blob';
xhr.send();
logEvent(docnum, doclang, 'format', specialty, source, docname);