如何在脚本中将汇编页面导出为PDF

时间:2016-08-04 15:00:53

标签: wget confluence export-to-pdf

我想自动将一些汇合页面导出为PDF。

可以使用URL下载:

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

输入此网址时,效果非常好。

但是当我尝试使用wget下载时,会下载HTML页面(要求输入登录名和密码)。我尝试使用--user--password wget选项提供登录名/密码,但它不起作用。

您是否有想法为wget命令提供汇总凭据?或者下载PDF页面的其他解决方案?

3 个答案:

答案 0 :(得分:3)

如果您在Confluence 5.5之前使用Confluence服务器,那么您很幸运! Confluence有一个API来处理这个问题,请参阅他们的documentation

更新:如果您使用的是Confluence Server 5.5或更高版本,则默认情况下为此启用API。参见 Confluence Administration&gt;进一步配置以启用XML-RPC和SOAP API。 (感谢@fatpanther指出这一点)

新的REST API不支持此功能,请参阅REST API documentation

您可以使用Confluence Command Line Interface导出为PDF。

答案 1 :(得分:2)

首先请求资源:

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

从生成的JSON中提取“Location”值(例如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

答案 2 :(得分:1)

Narcolessico的答案对我有用,但是我花了一些时间才能完全理解这种方法。我将添加到上面提供的答案中。

注意::我正在使用Java(Apache HttpClient)对Confluence服务器执行HTTP GET请求。

  1. 我使用Chrome浏览到要导出为PDF的Confluence页面。我展开了工具菜单,右键单击“导出为PDF”,然后单击“检查”。这将显示此菜单选项的基础HTML元素,其中包含用于启动PDF导出操作的链接。

inspect element to find url

  1. 元素检查发现与PDF导出操作的相对链接如下。

html source

  1. 从Java中,如果您对https://your-confluence-server-hostname/the-relative-link-from-step-2执行HTTP GET,则需要禁用重定向处理。在那儿,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,则会收到如下响应。

redacted cURL output

  1. 上面的GET请求和结果302响应将显示您可以下载的PDF文档的位置。 302个响应标头将包含以下内容。

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

这是以下形式的网址。

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

  1. 上方的位置标头包含导出/生成的PDF的网址。然后,您可以对该URL进行后续的HTTP GET,以下载生成的PDF文档。 如果您使用的是Apache Http客户端,则需要针对此后续GET请求使用自动重定向处理。

此答案的全部功劳归Narcolessico所有。我只是想添加我必须整理的细节,以使其能够从Java运行。