Печать документов

В API Контур.Экстерна реализована печать документов в черновиках и документооборотах.

  • для печати документа в черновике используйте метод GET DraftDocumentPrint.

  • для печати документа в документообороте используйте метод POST DocflowDocumentPrint.

  • для печати документа в документообороте описи используйте метод POST DocumentPrint.

Особенности методов печати

  1. Методы печати подготавливают печатную форму документа в формате pdf файла.

  2. Методы работают только с расшифрованными контентами.

  3. Методы поддерживают не все типы документов и контентов. Если печать невозможна, методы вернут ошибку 400 documentPrintUnsupported.

  4. Методы печати умеют работать только со следующими типами контента:

    • «application/octet-stream»,

    • «application/xml»,

    • «text/xml».

Асинхронный вызов методов

Методы печати необходимо выполнять асинхронно. Для этого в параметрах запроса передайте флаг deferred = true.

Предупреждение

Значение флага false для синхронного вызова метода устарело и больше не используется в методах API. При таком значении вернется ошибка 400 BadRequest.

Асинхронный вызов запроса создает задачу на печать. В ответе метода вернется идентификатор TaskId поставленной задачи. Для получения печатной формы нужно проверить статус выполнения задачи. Когда статус задачи будет равен succeed, печатная форма будет загружена в сервис контентов. В поле task-result будет лежать идентификатор контента content-id.

Печать документа в черновике

Методу печати в черновике в запросе нужно передать только идентификатор документа, так как все расшифрованные контенты были предварительно загружены в черновик.

Алгоритм печати документа в черновике

  1. Вызвать метод печати GET DraftDocumentPrint с флагом deferred = true. В случае успеха метод вернет идентификатор TaskId поставленной на печать задачи.

  2. Получить задачу GET DraftDocumentTask по TaskId. Когда статус будет равен значению succeed, в поле task-result будет лежать идентификатор контента content-id.

  3. Получить сформированную печатную форму документа GET Download по content-id.

Печать документа в документообороте

Как передать расшифрованный контент документа

Для метода печати в документообороте DocflowDocument Print в теле запроса необходимо передать идентификатор расшифрованного контента документа из сервиса контентов.

Если документ зашифрован, у документа в модели docflow-document-contents свойство encrypted равно true, то необходимо предварительно скачать и дешифровать документ. Если контент сжат — признак compressed = true, извлекать контент из архива не обязательно, метод умеет извлекать контент из архива. Далее нужно загрузить контент в сервис контентов. Полученный идентификатор передать в теле метода печати.

Если документ уже расшифрован, у документа признак encrypted равен false — скачивать ничего не нужно, в теле запроса передать идентификатор контента content-id. Идентификатор контента можно посмотреть в информации о документе, в параметре content.

Можно ли заранее узнать возможность печати?

В свойствах документа есть вспомогательный параметр SupportPrint (модель DocflowDocumentDescription). Это поле подсказывает, возможна ли печать документа. Оно может принимать значения: Yes, No, Unknown.

  • Если значение SupportPrint = yes, можно вызывать метод печати, и он вернет печатную форму документа.

  • Если значение SupportPrint = no, печать документа не поддерживается.

  • Если значение SupportPrint = unknown, не получилось определить возможность печати документа, можно попробовать вызвать метод печати.

Проверка подписи в документообороте

Во время печати метод проверяет переданный на печать расшифрованный и разжатый документ на соответствие подписи этого документа в документообороте. Если на печать передали контент измененного документа, то вернется ошибка.

Алгоритм печати документа в документообороте

Для удобства тестирования печати можно скачать файл коллекции Postman:

файл коллекции Postman

  1. Получить документ в документообороте методом GET DocflowDocument. В ответе важно посмотреть, что лежит в параметре docflow-document-contents: идентификатор content-id, по которому можно получить контент в сервисе контентов, флаги compressed и encrypted. В примере ниже контент документа зашифрован и сжат, флаги равны true.

Запрос

GET /v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8 HTTP/1.1

Ответ GET DocflowDocument:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip

{
    "id": "75d929b9-08a9-4692-961d-111cc87dc2e8",
    "description": {
        "type": "urn:document:fns534-report",
        "filename": "NO_SRCHIS_0007_0007_7757424860680345565_20200129_92425a70-4ac9-4680-bada-3666f0c0514n.xml",
        "content-type": "application/xml",
        "encrypted-content-size": 2237,
        "compressed": true,
        "requisites": {},
        "related-docflows-count": 0,
        "support-recognition": false,
        "encrypted-certificates": [
        {
            "serial-number": "01D0850043AB3C924A605B8D8661E43E"
        },
        {
            "serial-number": "33AC7500C3AAAE924839AA8AE6C459FE"
        },
        {
            "serial-number": "19CCC7C800010000215D"
        }
        ],
        "support-print": "yes"
    },
    "content": {
        "encrypted": {
        "rel": "encrypted-content",
        "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/encrypted-content"
        },
        "docflow-document-contents": [
        {
            "content-id": "f1facbc3-5d74-498f-a8af-dbfd57f82f1f",
            "encrypted": true,
            "compressed": true
        }
        ]
    },
    "send-date": "2020-02-26T06:51:08.4636938Z",
    "signatures": [
        {
        "id": "82d5457d-5297-49fb-949a-f9865a1491b1",
        "title": "ООО 'Баланс Плюс' (Марков Георгий Эльдарович)",
        "signature-certificate-thumbprint": "20AACA440F33D0C90FBC052108012D3062D44873",
        "content-link": {
            "rel": "content",
            "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/signatures/82d5457d-5297-49fb-949a-f9865a1491b1/content"
        },
        "links": [
            {
            "rel": "self",
            "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/signatures/82d5457d-5297-49fb-949a-f9865a1491b1/content"
            },
            {
            "rel": "docflow",
            "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9"
            }
        ]
        },
        {
        "id": "045d9beb-7748-4789-a539-4416fa7969b9",
        "title": "ООО 'Баланс Плюс' (Марков Георгий Эльдарович)",
        "signature-certificate-thumbprint": "20AACA440F33D0C90FBC052108012D3062D44873",
        "content-link": {
            "rel": "content",
            "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/signatures/045d9beb-7748-4789-a539-4416fa7969b9/content"
        },
        "links": [
            {
            "rel": "self",
            "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/signatures/045d9beb-7748-4789-a539-4416fa7969b9/content"
            },
            {
            "rel": "docflow",
            "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9"
            }
        ]
        },
        {
        "id": "565164bb-c9d5-4805-8250-7f6a4ac9d4aa",
        "title": "Корионов  Илья Валерьянович",
        "signature-certificate-thumbprint": "344AAD7111FC77ADE2A98FFB5E35F039BC4DD650",
        "content-link": {
            "rel": "content",
            "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/signatures/565164bb-c9d5-4805-8250-7f6a4ac9d4aa/content"
        },
        "links": [
            {
            "rel": "self",
            "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/signatures/565164bb-c9d5-4805-8250-7f6a4ac9d4aa/content"
            },
            {
            "rel": "docflow",
            "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9"
            }
        ]
        }
    ],
    "links": [
        {
        "rel": "docflow",
        "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9"
        },
        {
        "rel": "self",
        "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8"
        },
        {
        "rel": "related-docflow",
        "href": "https://extern-api.testkontur.ru//v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/related"
        },
        {
        "rel": "encrypted-content",
        "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/encrypted-content"
        },
        {
        "rel": "decrypt-content",
        "href": "https://extern-api.testkontur.ru/v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/decrypt-content"
        }
    ]
}
  1. Скачать контент из сервиса контентов GET Download по content-id.

  2. Расшифровывать полученный документ и загрузить его обратно в сервис контентов POST Upload. В ответе метод вернет новый идентификатор content-id2.

  3. Вызвать метод печати POST DocflowDocumentPrint с флагом deferred = true. В теле метода передать content-id2. В ответе вернется идентификатор поставленной на печать задачи TaskId.

Запрос

POST /v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/print?deferred=true HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/json

{
    "content-id": "d065adea-8b9d-4228-bc17-8f86539e01a3"
}

Ответ

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 126

{
    "id": "819ade20-665c-470a-befc-e897a56e1641",
    "task-state": "running",
    "task-type": "urn:task-type:docflowPrint"
}
  1. Получить по TaskId результат выполнения задачи на печать в методе GET DocflowDocumentTask. Запрашивать задачу нужно до тех пор, пока task-state = running. Когда задача завершится со статусом succeed, в поле «task-result» будет лежать новый идентификатор content-id3.

    Примечание

    Чем больше документ, тем больше времени необходимо сервису для печати, рекомендуемый интервал между повторными запросами — 5 секунд.

Запрос

GET /v1/bd0cd3f6-315d-4f03-a9cc-3507f63265ed/docflows/a9bc74bd-311b-43f0-aff7-faba24ce35d9/documents/75d929b9-08a9-4692-961d-111cc87dc2e8/tasks/819ade20-665c-470a-befc-e897a56e1641 HTTP/1.1
Authorization: Bearer <token>

Ответ

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 210

{
    "id": "819ade20-665c-470a-befc-e897a56e1641",
    "task-state": "succeed",
    "task-type": "urn:task-type:docflowPrint",
    "task-result": {
        "content-id": "9f6b57db-db9f-4e4c-8375-62a3504e663d"
    }
}
  1. Получить документ из сервиса контентов по content-id3. Будет загружен готовый pdf файл.