Вопрос или проблема
Я работаю над страницей печати счёта в Oracle Apex. Эта страница – динамическое содержимое PLSQL. У неё есть кнопка печати, и когда вы на неё нажимаете, открывается страница предварительного просмотра печати. Когда вы выбираете сохранить как PDF вместо печати страницы, я хочу изменить имя по умолчанию на номер счёта, который я сохраняю. Я пытался сделать это, используя код JavaScript на странице, но это не работает. Вот код, который я использовал:
htp.p(‘
Просмотр счёта
// Функция для динамического построения URL с inv_code
function openInvoicePage(inv_code) {
// Создать новый URL с inv_code
var baseUrl="https://hekalit.oracleapexservices.com/apexdbl/r/hekalit22/ite-i-com-erp-for-emaar159/invoicepage/P48_INV_CODE";
var session = '&APP_SESSION.';
var fullUrl = baseUrl + :P48_INV_CODE + '?session=' + session;
// Перенаправить на созданный URL
window.location.href = fullUrl;
}
</script>
'); ```
Может кто-нибудь помочь мне?
Ответ или решение
Как изменить имя PDF-файла при сохранении из страницы печати в Oracle APEX
Работа с печатью и экспортом документов в Oracle APEX может быть довольно сложной задачей, особенно когда дело касается настройки имени файла PDF. Давайте разберем, как изменить имя PDF-файла, сохраняемого со страницы печати, чтобы оно отражало номер счета (invoice number).
1. Понимание проблемы
Ваша задача состоит в том, чтобы задать имя PDF-файлу, соответствующее номеру счета, когда пользователь выбирает опцию «Сохранить как PDF» на странице предпросмотра печати. Вы уже пробовали использовать JavaScript для генерирования URL для этой задачи, но, к сожалению, это не сработало.
2. Стандартный подход
Oracle APEX использует механизм, встроенный в браузер для обработки печати и сохранения файлов. При сохранении PDF нейминг обычно управляется сервером и настройками документа, а не клиентским кодом. Однако мы можем использовать метод программирования для достижения необходимого результата.
3. Настройка имени файла PDF
Чтобы изменить имя файла при его загрузке, вам необходимо установить правильный заголовок в PL/SQL-коде, который генерирует PDF-документ. Это можно сделать следующим образом:
Пример кода
-
Создание PL/SQL-процедуры для генерации PDF:
DECLARE l_output_file BLOB; l_file_name VARCHAR2(100); BEGIN -- Получение номера счета l_file_name := 'Invoice_' || :P48_INV_CODE || '.pdf'; -- Генерация PDF из PLSQL Dynamic Content -- (Предположим, что генерация BLOB происходит здесь) -- Установка заголовка для корректного имени файла OWA_UTIL.mime_header('application/pdf', FALSE); HTP.p('Content-Disposition: attachment; filename="' || l_file_name || '"'); HTP.p('Content-Length: ' || DBMS_LOB.getlength(l_output_file)); HTP.p(''); -- Пустая строка для разделения заголовка и содержимого -- Отправка файла WTP.write(l_output_file); END;
-
Обновление кода на странице:
Убедитесь, что ваша кнопка «Печать» вызывает эту процедуру. Например:<button onclick="openInvoicePage(:P48_INV_CODE)">Показать счет</button>
4. Исправление JavaScript
Ваш JavaScript код для переключения на нужную страницу выглядит корректно, но убедитесь, что URL правильно формируется и что ваша переменная с номером счета (:P48_INV_CODE
) передается в функцию. Если это не так, попробуйте следующий код:
function openInvoicePage(inv_code) {
var baseUrl = "https://hekalit.oracleapexservices.com/apexdbl/r/hekalit22/ite-i-com-erp-for-emaar159/invoicepage/P48_INV_CODE";
var session = "&APP_SESSION=" + encodeURIComponent(document.cookie.split('; ').find(row => row.startsWith('APEX'))?.split('=')[1]);
var fullUrl = baseUrl + inv_code + session;
window.location.href = fullUrl;
}
5. Тестирование решения
После внедрения изменений обязательно протестируйте функцию, чтобы удостовериться, что новое имя файла корректно устанавливается и файл генерируется без ошибок. Убедитесь, что все переменные определены и переданы правильно.
Заключение
С изменением имени файла PDF при его сохранении в Oracle APEX можно справиться с помощью настройки серверной части кода PL/SQL. Этот подход позволяет установить имя файла, основанное на значении переменной, предоставленной пользователем. Как всегда, тестируйте изменения в безопасной среде, прежде чем обновлять производственный сайт, чтобы избежать непредвиденных ошибок.