Вот пример, который я быстро набрал, используя APEX_APPLICATION_TEMP_FILES
. Надеюсь, это то, что вы пытаетесь достичь.
https://apex.oracle.com/pls/apex/f?p=34781
Имя пользователя: демо
Пароль: демо
Используется проект PDF.js от Mozilla. Вот быстрый рецепт того, что вам может понадобиться.
- Создайте элемент страницы
File Browse
и установите тип хранилища на Table APEX_APPLICATION_TEMP_FILES
.
- Создайте кнопку страницы для отправки страницы.
Создайте область классического отчета и введите следующий запрос:
select
id
, filename
from apex_application_temp_files
where application_id = :APP_ID
Добавить виртуальный столбец и установить выражение HTML:
<button type="button" class="btn-preview-pdf" data-id="#ID#">Preview</button>
Создайте регион и введите в Источник следующее:
<canvas id="preview-pane"></canvas>
Создать динамическое действие Click.
а. Установите тип выбора на jQuery Selector
.
б. Введите jQuery Selector .btn-preview-pdf
.
Добавьте действие Execute JavaScript Code
со следующим JS-кодом (см. Примеры на веб-сайте PDF.js для получения более подробной информации о том, что делает код):
var fileId = $(this.triggeringElement).data('id');
var docUrl = 'f?p=&APP_ID.:0:&APP_SESSION.:APPLICATION_PROCESS=DOWNLOADPDF:::FILE_ID:' + fileId;
var previewPane = this.affectedElements[0];
// from PDF.js examples
pdfjsLib.getDocument(docUrl).then(function(pdf) {
var pageNumber = 1;
pdf.getPage(pageNumber).then(function(page) {
console.log('Page loaded');
var scale = 1.5;
var viewport = page.getViewport(scale);
// Prepare canvas using PDF page dimensions
var canvas = previewPane;
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
// Render PDF page into canvas context
var renderContext = {
canvasContext: context,
viewport: viewport
};
var renderTask = page.render(renderContext);
renderTask.then(function () {
console.log('Page rendered');
});
})
}, function(reason) {
console.error(reason);
});
Для действия также установите Затронутые элементы:
а. Тип выбора: jQuery Selector
б. JQuery Selector: #preview-pane
Следуйте посту Джоэля Каллмана * при создании ссылки для загрузки файла. Вам понадобится прикладной процесс (DOWNLOADPDF
) и элемент приложения (FILE_ID
). Модифицированный код для прикладного процесса DOWNLOADPDF
выглядит следующим образом:
begin
for file in (select *
from apex_application_temp_files
where id = :FILE_ID) loop
--
sys.htp.init;
sys.owa_util.mime_header( file.mime_type, FALSE );
sys.htp.p('Content-length: ' || sys.dbms_lob.getlength( file.blob_content));
sys.htp.p('Content-Disposition: attachment; filename="' || file.filename || '"' );
sys.htp.p('Cache-Control: max-age=3600'); -- tell the browser to cache for one hour, adjust as necessary
sys.owa_util.http_header_close;
sys.wpg_docload.download_file( file.blob_content );
apex_application.stop_apex_engine;
end loop;
end;
Почти пропустил это. На странице Атрибуты задайте URL-адрес файла JavaScript для любого из CDN , перечисленных . Например:
// cdnjs.cloudflare.com/ajax/libs/pdf.js/2.0.550/pdf.min.js
Обратите внимание, что это очень простой прототип. Предварительный просмотр позволяет только просматривать первую страницу. Вам нужно будет выяснить API , а затем сделать все необходимое, чтобы разрешить многостраничный просмотр. Я оставлю тебя, чтобы понять это.
Так и должно быть. Дайте мне знать, если это не сработает для вас.