Как экспортировать в PDF страницу слияния в скрипте

Я хотел бы автоматически экспортировать в PDF некоторые страницы слияния.

Его можно скачать по URL:

  • http://<confluence server>/confluence/spaces/flyingpdf/pdfpageexport.action?pageId=<pageID>

При вводе этого URL-адреса он работает отлично.

Но когда я пытаюсь загрузить с wget, вместо этого загружается HTML-страница (с запросом логина и пароля). Я попытался указать логин / пароль с помощью параметров --user и --password wget, но это не сработало.

У вас есть идея предоставить учетные данные слияния команде wget? Или другое решение для загрузки страницы PDF?


person Alpes Maritimes    schedule 04.08.2016    source источник


Ответы (3)


Если вы используете Confluence Server до Confluence 5.5, вам повезло! У Confluence есть API для решения этой проблемы, см. Их документация.

Обновление: если вы используете Confluence Server 5.5 или более поздней версии, они не включают API для этого по умолчанию. См. Раздел Администрирование Confluence> Дополнительная настройка, чтобы включить API XML-RPC и SOAP. (Спасибо @fatpanther за указание на это)

Новый REST API не поддерживает это, см. документацию по REST API. >.

Вы можете использовать интерфейс командной строки Confluence экспортировать в PDF.

person Brandon Haugen    schedule 05.08.2016
comment
На самом деле кажется, что API-интерфейсы XML-RPC и SOAP устарели в версиях ›5.5, но все еще доступны для использования. Вы должны сначала включить их: (Администрирование Confluence ›Дальнейшая настройка) - person fatpanther; 20.01.2017
comment
Спасибо @fatpanther, я обновил ответ, включив в него информацию о включении API XML-RPC / SOAP. - person Brandon Haugen; 27.01.2017

Сначала запросите ресурс:

curl -D- -u user:pwd -X GET -H "Content-Type: application/json" "https://your-url/confluence/spaces/flyingpdf/pdfpageexport.action?pageId=12345678"

Извлеките значение «Location» из полученного JSON (например, grep | cut), затем повторите запрос с настроенным URL-адресом и типом MIME:

curl -D- -u user:pwd -X GET -H "Content-Type: text/html;charset=UTF-8" "https://your-url/$LOCATION_JUST_EXTRACTED" --output file.pdf
person Narcolessico    schedule 14.05.2018

Ответ Narcolessico сработал для меня, но мне потребовалось некоторое время, чтобы полностью понять подход. Добавлю к ответу, указанному выше.

ПРИМЕЧАНИЕ. Я использую Java (Apache HttpClient) для выполнения HTTP-запросов GET к серверу Confluence.

  1. Я использовал Chrome для перехода на страницу Confluence, которую хотел экспортировать в PDF. Я развернул меню инструментов, щелкнул правой кнопкой мыши «Экспорт в PDF», а затем щелкнул «Проверить». Это покажет базовый элемент HTML для этого пункта меню, содержащий ссылку, используемую для запуска операции экспорта PDF.

проверьте элемент, чтобы найти URL

  1. Проверка элементов выявила следующую относительную ссылку на действие экспорта PDF.

исходный код html

  1. Из Java, если вы выполняете HTTP GET на https://your-confluence-server-hostname/the-relative-link-from-step-2, вам нужно будет отключить обработку перенаправления. Вот где ответ Narcolessico смутил меня, поскольку я получал разные ответы от cURL и Java. Когда я понял, что операция cURL возвращает ответ 302 и что клиент Apache Http автоматически обрабатывает его, я нашел способ отключить эту обработку автоматического перенаправления, чтобы я мог захватывать информацию заголовка Location.

Код для отключения обработки автоматического перенаправления выглядит следующим образом.

    final HttpClient client = HttpClientBuilder
        .create()
        .setSSLContext(sslContext)
        .disableRedirectHandling() // disable the auto handling here
        .build();

    final String urlToGetLocation = "https://<your-confluence-server-hostname><the-relative-link-from-step-2>"

    final HttpGet request = new HttpGet(urlToGetLocation);
    // You'll need to provide Basic Auth credentials. This is a base-64 encoded
    // username:password string, else the Location header returned will be a 
    // redirect to the login page.
    request.setHeader(HttpHeaders.AUTHORIZATION, authorizationHeaderValue);
    request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");

    final HttpResponse response = client.execute(request);

    final HttpEntity payload = response.getEntity();

ПРИМЕЧАНИЕ. Я также отменяю контекст SSL, чтобы ничего не делать. Это еще одна проблема, с которой вам, возможно, придется бороться, если Confluence использует HTTP.

Кстати, если вы выполните CURL GET для указанного выше URL-адреса, вы получите следующий ответ.

отредактированный вывод cURL

  1. Вышеупомянутый запрос GET и результирующий ответ 302 покажут расположение PDF-документа, который вы затем можете загрузить. Заголовки ответа 302 будут содержать следующее.

    final Header[] headers = response.getHeaders(HttpHeaders.LOCATION);
    
    final String location = headers[0].getValue();
    

Это URL-адрес следующего вида.

/download/temp/pdfexport-20190924-240919-0526-189/a-filename-for-pdf.pdf?contentType=application/pdf

  1. Заголовок Location выше содержит URL-адрес экспортированного / сгенерированного PDF-файла. Затем вы можете выполнить последующий HTTP-запрос GET на этот URL-адрес, чтобы загрузить сгенерированный документ PDF. если вы используете клиент Apache Http, вам необходимо использовать обработку автоматического перенаправления для этого последующего запроса GET.

Вся заслуга Narcolessico за этот ответ. Я просто хотел добавить детали, которые мне нужно было разобрать, чтобы заставить его работать с Java.

person user12113182    schedule 24.09.2019