@prozorro/prozorro-pdf
v1.2.27
Published
PDF generation service
Maintainers
Readme
@prozorro/prozorro-pdf
Бібліотека для формування, перегляду та завантаження PDF-документів у Prozorro.
Працює у зв’язці з бібліотекою електронного підпису @prozorro/prozorro-eds.
Основні можливості:
- відкриття документа у новій вкладці;
- завантаження документа;
- вставка документа у сторінку у вигляді
iframe.
Встановлення
npm i @prozorro/prozorro-pdfабо
yarn add @prozorro/prozorro-pdfШвидкий старт
Бібліотека незалежна від конкретного фреймворку — ви можете використовувати її у Vue.js, React, Angular чи будь-яким іншим середовищем.
Приклад використання (Vue.js + TypeScript)
<template>
<div id="pdfParentFrameID"></div>
</template>
<script setup lang="ts">
import { onMounted, ref } from "vue";
import { useRoute } from "vue-router";
import {
ENVIRONMENT_MODE,
PROZORRO_PDF_TYPES,
ProzorroPdfService,
IPrzorroPdfErrorExceptionCore,
PROZORRO_TEMPLATE_CODES,
} from "@prozorro/prozorro-pdf";
const route = useRoute();
const pdfError = ref<IPrzorroPdfErrorExceptionCore | null>(null);
onMounted(async () => {
const { params: { type }, query: { dateModified, url, tenderUrl, contractTemplateName, title } } = route;
try {
ProzorroPdfService.init(ENVIRONMENT_MODE.SANDBOX);
await ProzorroPdfService.setConfig({
type: type as PROZORRO_PDF_TYPES,
url,
});
await ProzorroPdfService.getIframe({
tender: tenderUrl,
title: title ?? "sign.p7s",
date: dateModified,
contractTemplateName: contractTemplateName as PROZORRO_TEMPLATE_CODES,
}, "pdfParentFrameID");
} catch (error) {
pdfError.value = error as IPrzorroPdfErrorExceptionCore;
}
});
</script>
<style scoped lang="scss">
#signToDocFrameID {
width: 100%;
height: 100vh;
}
</style>API
Type PdfDocumentConfigType
Аргументи:
title: string— назва файлу в об'єкті документу (наприклад,"sign.p7s");date?: string— дата модифікації документа;contractTemplateName?: string— назва шаблону контракту;tender?: string— посилання на об’єкт тендеру;fileName?: string— назва завантажувального файлу.
init(environment: ENVIRONMENT_MODE): void
Ініціалізація та початок роботи з бібліотекою.
Аргументи:
environment: ENVIRONMENT_MODE— тип середовища "SANDBOX", "STAGING" або "PRODUCTION"
setConfig({ url: string, type: string }): Promise<void>
Встановлює посилання на об’єкт із ЦБД та тип документа.
Аргументи:
url: string— посилання на об’єкт;type: string— тип документа (значення зPROZORRO_PDF_TYPES).
open(config: PdfDocumentConfigType): Promise<void>
Відкриття документа у новій вкладці браузера.
Аргументи:
config- тип PdfDocumentConfigType
save(config: PdfDocumentConfigType, fileName?: string): Promise<void>
Завантаження документа.
Аргументи:
config- тип PdfDocumentConfigTypefileName- назва файлу, за замовчуваннямdocument.title
getIframe(config: PdfDocumentConfigType, parentFrameId?: string): Promise<void>
Створює iframe у контейнері з вказаним ID.
Аргументи:
config- тип PdfDocumentConfigTypeparentFrameId- ID батьківського елементу, в середину якого буде втавлено iframe з ПДФ, за замовчуваннямsignToDocFrameID
Типи документів
| Type | Title | Description | Fields |
| ---------------------------------------- |---------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|
| TICKET | Запит до ДПС / Довідка ДПС | Get all sign files from tender.awards[N].documents.File title must have extensions *.XML.p7s or *.KVT.p7s.Optional validation by document.dateModified. | • url – Tender URL (required, string)• title – Document title (required, string)• date – Date modified (date) |
| CONCLUSION | Висновок про результати моніторингу | Get all sign files from monitoring.conclusion[N].documents.File title must have extension *.p7s.Optional validation by document.dateModified.If not set → take last document. | • url – Monitoring URL (required, string)• title – Document title (required, string)• date – Date modified (date) |
| NAZK | Довідка НАЗК | Get all sign files from award.documents.File title must have extension *.p7s.document.title must be "napc".document.documentType must be "register".Take last document. | • url – Award URL (required, string) |
| ANNOUNCEMENT | Оголошення про проведення закупівлі | Get all sign files from tender.documents.File title must be sign.p7s.Optional validation by document.dateModified.If not set → take last document. | • url – Tender URL (required, string)• date – Date modified (date) |
| PQ | Шаблони договорів | 2 options:• Empty contract template – field Contract template name must be one of valid codes.• Filled contract template – use Tender / Contract URL + Contract template name. | • url – Tender URL (string)• contractTemplateName – Contract template name (string) |
| ANNUAL_PROCUREMENT_PLAN | еПротокол затвердження річного плану закупівель | Get all sign files from plan.documents.File title must be sign.p7s.Optional validation by document.dateModified.If not set → take last document. | • url – Plan URL (required, string)• date – Date modified (date) |
| TENDER_REJECTION_PROTOCOL | еПротокол відхилення пропозиції | Get all sign files from award.documents.document.documentType must be "notice".award.status must be "unsuccessful" or "cancelled".If "cancelled" → award.eligible or award.qualified must be false.Optional validation by document.dateModified. | • url – Award URL (required, string)• date – Date modified (date) |
| DETERMINING_WINNER_OF_PROCUREMENT | еПротокол визначення переможця та намір укласти договір | Get all sign files from award.documents.document.documentType must be "notice".award.status must be "active" or "cancelled".If "cancelled" → award.qualified must be true and award.eligible must be true/undefined.Optional validation by document.dateModified. | • url – Award URL (required, string)• date – Date modified (date) |
| PROTOCOL_ON_EXTENSION_OF_REVIEW_PERIOD | еПротокол продовження строку розгляду пропозиції | Get all sign files from award.documents.document.documentType must be "extensionReport".Optional validation by document.dateModified.If not set → take last document. | • url – Award URL (required, string)• date – Date modified (date) |
| PURCHASE_CANCELLATION_PROTOCOL | еПротокол відміни закупівлі/лоту | Get all sign files from cancellation.documents.document.documentType must be cancellationReport.Optional validation by document.dateModified.If not set → take last document. | • url – Cancellation URL (required, string)• date – Date modified (date) |
| PROTOCOL_CONSIDERATION_TENDER_OFFERS | еПротокол розгляду тендерних пропозицій | document.documentType must be "evaluationReports".document.title must be "sign.p7s".Optional validation by document.dateModified.If not set → take last document. | • url – Document URL (required, string)• date – Date modified (string) |
| TENDER_OFFER | еПропозиція | Get all sign files from bid.documents or bid.financialDocuments.document.documentType must be "proposal". | • url – Bid URL (required, string)• date – Date modified (required, string) |
| EDR | Довідка ЄДР | Get all sign files from award.documents or qualification.documents.document.documentType must be "registerExtract".Optional file title (default: edr_identification.yaml).Optional validation by document.dateModified.If not set → take last document. | • url – Awards / Qualification URL (required, string)• title – Document title (string)• date – Date modified (string) |
| EDR_2 | Витяг з ЄДР 2.0 | Get YAML files from award.documents or qualification.documents.document.documentType must be "registerUSR".document.format must be "application/yaml".Optional validation by document.title and document.dateModified.If not set → take last matching document. | • url – Awards / Qualification URL (required, string)• title – Document title (string)• date – Date modified (string) |
| COMPLAINT | Скарга до органу оскарження | Get all sign files from complaint.documents.document.title must be "sign.p7s".Newest document is chosen by dateModified. | • url – Complaint URL (required, string)• tender – Tender URL (string) |
| COMPLAINT_POST | Запити/пояснення до скарги | Field complaint.post mustn’t be empty. | • url – Complaint URL (required, string)• tender – Tender URL (string) |
| DEVIATION_REPORT | Протокол рішення УО щодо виявлення невідповідностей (24 год) | Get all sign files from award.documents or qualification.documents.document.documentType must be "deviationReport".Optional validation by document.dateModified.If not set → take last document. | • url – Awards / Qualification URL (required, string)• date – Date modified (string) |
Обробка помилок
Бібліотека використовує уніфіковану систему обробки помилок, яка повертає екземпляри IPrzorroPdfErrorExceptionCore для всіх випадків помилок. Це забезпечує послідовну обробку помилок і надає детальну інформацію про помилки.
Структура помилки
Кожен об’єкт помилки реалізує інтерфейс IPrzorroPdfErrorExceptionCore і містить:
code: Ідентифікатор типів помилок (PROZORRO_PDF_ERROR_CODESenum)details: Містить розширену інформацію про помилку (ErrorDetailsModel)timestamp: Час створення помилкиlogWithTrace(): Метод для реєстрації помилок з трасуванням
Типи помилок (PROZORRO_PDF_ERROR_CODES)
| Код | Опис | Можливі причини | Рекомендовані дії | | :--- | :--- | :--- | :--- | | INVALID_SIGNATURE | Помилка електронного підпису | Підпис пошкоджений, некоректний формат, підпис не відповідає даним | Перевірити цілісність підпису, повторно підписати | | INVALID_PARAMS | Некоректні вхідні дані | Неповні дані, некоректний формат параметрів, відсутні URL | Валідувати дані перед передачею в бібліотеку | | VALIDATION_FAILED | Помилка бізнес-логіки | Відсутні дані в об'єкті (наприклад, awards, conclusion), невідповідність статусів | Перевірити наявність всіх необхідних даних у ЦБД | | PDF_GENERATION_FAILED | Помилка генерації PDF | Внутрішня помилка генератора PDF Make | Звернутись до технічної підтримки | | SERVICE_UNAVAILABLE | Сервіс недоступний | Внутрішні помилки сервісу, неможливо визначити стратегію | Звернутись до технічної підтримки |
Детальні повідомлення про помилки
| Тип помилки | Ключ повідомлення | Повідомлення | Контекст валідації |
| :--- |:------------------------------| :--- | :--- |
| INVALID_SIGNATURE | documentAccess | Не вдалося отримати доступ до файлу підпису | Помилка при спробі завантажити файл підпису за посиланням |
| | documentEncoding | Не вдалося розшифрувати файл підпису | Помилка при спробі декодувати контент файлу (p7s) |
| INVALID_PARAMS | incorrectInputFormat | Неправильний формат вхідних даних | Передані типи даних не відповідають очікуваним |
| | undefinedUrl | Відсутнє посилання на об'єкт ЦБД | Обов'язкове поле url у setConfig не передано |
| | undefinedTitle | Відсутній параметр "Document title" | Обов'язкове поле title (для деяких типів) не передано |
| | undefinedDate | Відсутній параметр "Date modified" | Обов'язкове поле date (для деяких типів) не передано |
| VALIDATION_FAILED | undefinedObject | Дані об'єкта ЦБД відсутні | Завантажений JSON об'єкт пустий або некоректний |
| | undefinedAwards | Відсутнє поле "awards" об'єкта з ЦБД | У завантажених даних тендеру відсутній масив awards |
| | undefinedStatus | Відсутнє поле "status" об'єкта "award" | У об'єкті нагороди відсутній статус |
| | undefinedConclusion | Відсутнє поле "conclusion" об'єкта з ЦБД | У даних моніторингу відсутній розділ conclusion |
| | undefinedConclusionOfDocs | Відсутнє поле "document" в об'єкті "conclusion" | У висновку моніторингу відсутні посилання на документи |
| | undefinedDocumentTitle | Не вдалося знайти ім'я документу в об'єкті | Не знайдено документа з відповідним заголовком у списку |
| | wrongDocumentType | Не вдалося визначити тип документу | Документи в списку не відповідають очікуваному documentType |
| | signersObjectUnavailable | Виникла помилка при формуванні колонтитулу з підписом | Не вдалося отримати інформацію про підписувачів з файлу |
| | documentListUndefined | Відсутній список документів для отримання посилання файлу підпису | Поле documents в об'єкті відсутнє або пусте |
| | wrongDocumentTypeStatus | Неправильний тип документу | Тип документа не відповідає вимогам обраного шаблону PDF |
| | wrongDocumentFormat | Неправильний формат документу | Формат документа не відповідає вимогам обраного шаблону PDF |
| | wrongDocumentTitle | Неправильний заголовок документу | Заголовок документа не відповідає очікуваному (наприклад, не "sign.p7s") |
| | wrongURL | Неправильне посилання на документ | У списку документів відсутнє або некоректне поле url |
| | tenderLoader | Виникла помилка при завантаженні документу закупівлі. Не передано "config.tender" | Для деяких типів (наприклад, COMPLAINT) потрібно посилання на тендер |
| | undefinedCancellationStatus | Статус відміни закупівлі відсутній | У об'єкті cancellation відсутнє поле status |
| | awardStatusNotFind | Статус в "award" не відповідає заданим умовам | Статус нагороди не є допустимим для генерації обраного PDF |
| | wrongDocumentDate | Неправильна дата документу (dateModified не відповідає переданій даті) | dateModified документа не збігається з переданою датою |
| | wrongQualified | Поле "qualified" не "true" | Бізнес-перевірка: учасник має бути кваліфікований |
| | wrongEligible | Поле "eligible" не "true" | Бізнес-перевірка: учасник має відповідати вимогам |
| | wrongEligibleOrQualified | Поле "eligible" або "qualified" не "false" | Перевірка для еПротоколу відхилення |
| | awardNotFound | Відсутня інформація про закупівлю та переможця в файлі підпису | Дані всередині підпису не містять потрібної інформації про закупівлю та переможця |
| | suppliersIsNotDefined | Відсутня інформація про постачальників | Поле suppliers відсутнє в об'єкті award/bid |
| | cancellationNotFound | Відсутня інформація про закупівлю та/або відміну закупівлі/лоту в файлі підпису | У файлі підпису відсутні дані про закупівлю або скасування закупівлі/лоту |
| | participantsIsNotDefined | Відсутня інформація про учасників | Поле participants відсутнє в даних |
| | tenderersIsNotDefined | Відсутня інформація про учасника в даних пропозиції | Поле tenderers відсутнє в даних пропозиції |
| | wrongEdrDocumentType | Поле "documentType" не "registerExtract" | Перевірка типу документа для ЄДР |
| | wrongEdr2DocumentType | Поле "documentType" не "registerUSR" | Перевірка типу документа для EDR_2 |
| | wrongEdrFile | На жаль, за вказаним кодом нічого не знайдено | Помилка пошуку в даних ЄДР |
| | undefinedPosts | В скарзі відсутні не пусті об'єкти objections:posts. | У даних скарги відсутні деталі заперечень |
| | encodingOrError | Невірний формат вхідних даних або не валідний підпис | Структура даних не відповідає валідаціям або вказано не підтримуване кодування файлу |
| SERVICE_UNAVAILABLE | typeIsNotDefined | Неможливо отримати стратегію обробки типів | Передано невідомий PROZORRO_PDF_TYPES |
| | loaderTypeIsNotDefined | Не вдається отримати стратегію типу завантажувача pdf | Внутрішня помилка вибору стратегії завантаження даних |
Приклад обробки помилок
import { IPrzorroPdfErrorExceptionCore, PROZORRO_PDF_ERROR_CODES } from "@prozorro/prozorro-pdf";
try {
await ProzorroPdfService.setConfig({
url: '/tender-url',
type: PROZORRO_PDF_TYPES.TICKET
});
await ProzorroPdfService.open({ title: 'document.xml.p7s' });
} catch (error) {
const pdfError = error as IPrzorroPdfErrorExceptionCore;
switch (pdfError.code) {
case PROZORRO_PDF_ERROR_CODES.INVALID_PARAMS:
console.error("Перевірте вхідні параметри:", pdfError.details.message);
break;
case PROZORRO_PDF_ERROR_CODES.VALIDATION_FAILED:
console.error("Помилка валідації даних:", pdfError.details.message);
break;
default:
console.error("Виникла помилка:", pdfError.details.message);
}
}Release notes
- 24.10.2025
- Removed environment dependency from
-betalibrary tag; - Changed the arguments of
initmethod;
- Removed environment dependency from
- 27.10.2025
- Remove ProzorroEds manual dependency from documentation
- Fix bugs in the
Announcementtype
- 28.10.2025
- Added
filenameoptional field toopenmethod; - Changed the environment mode to
enumtype and values to:SANDBOX,STAGING,PRODUCTION; - Fix PQ for
SANDBOXenvironment;
- Added
- 06.11.2025
- Added new Contract template name
NUSH.0001.01for PQ
- Added new Contract template name
- 10.11.2025
- Fixed ANNOUNCEMENT securement amount
- 12.11.2025
- Added DEVIATION_REPORT PDF
- Fix PQ Item Attributes
- 14.11.2025
- Optimized library speed;
- Updated documentation;
- Added
parentFrameIdtogetIframemethod;
- 20.11.2025
- Fixed Announcement Items table
- 05.12.2025
- Updated ANNOUNCEMENT texts
- 08.12.2025
- Updated ANNOUNCEMENT texts
- 10.12.2025
- Fix table width in
DEVIATION_REPORT
- Fix table width in
- 22.01.2026
- Fixed
ANNOUNCEMENTvisualization plan's ids
- Fixed
- 23.01.2026
- Fixed Announcement Items table
- 30.01.2026
- Added error handling documentation
- 23.02.2026
- Refactored
ANNOUNCEMENTsubtitles
- Refactored
- 26.02.2026
- Fixed
CONSLUSIONpdf with unvalid sign
- Fixed
- 12.03.2026
- Updated
PURCHASE_CANCELLATION_PROTOCOLvalidation rules:- Before: Field
document.titlemust be"sign.p7s" - After: Field
document.documentTypemust be"cancellationReport".
- Before: Field
- Updated
- 19.03.2026
- Fix calculation prices in PQ;
- Fix
value.amountandminimalStep.amountin ANNOUNCEMENT; - Added
value.amountPercentageandminimalStep.amountPercentageto ANNOUNCEMENT;
- 24.03.2026
- Update
TENDER_OFFERfor ARMA;
- Update
- 01.04.2026
- Added new
EDR_2document type; - Updated validation error documentation in
README.md;
- Added new
- 08.04.2026
- Fix
PQfirst generation;
- Fix
- 10.04.2026
- Fix
PQDPA type generation;
- Fix
- 28.04.2026
- Fix address preview;
- 04.05.2026
- Added
getDataUrlmethod toProzorroPdfService. Method return PDF inblobformat;
- Added
- 25.05.2026
- Removed local dictionaries for
ANNOUNCEMENTtype;
- Removed local dictionaries for
Ліцензія
© Prozorro. Усі права захищені.
