我想自动将一些 Confluence 页面导出为 PDF。
可通过网址下载:
http://<confluence server>/confluence/spaces/flyingpdf/pdfpageexport.action?pageId=<pageID>
输入此网址时,效果非常好。
但是当我尝试使用
wget
下载时,会下载一个 HTML 页面(要求登录名和密码)。我尝试使用 --user
和 --password
wget 选项提供登录名/密码,但它不起作用。
您有想法向
wget
命令提供汇合凭证吗?或者其他下载 PDF 页面的解决方案?
如果您使用 Confluence 5.5 之前的 Confluence 服务器,那么您很幸运! Confluence 有一个 API 可以处理这个问题,请参阅他们的文档。
更新:如果您使用的是 Confluence Server 5.5 或更高版本,默认情况下它们不会为此启用 API。请参阅Confluence 管理 > 进一步配置 以启用 XML-RPC 和 SOAP API。 (感谢@fatpanther指出了这一点)
新的 REST API 不支持此功能,请参阅 REST API 文档。
您可以使用 Confluence 命令行界面 导出为 PDF。
首先请求资源:
curl -D- -u user:pwd -X GET -H "Content-Type: application/json" "https://your-url/confluence/spaces/flyingpdf/pdfpageexport.action?pageId=12345678"
从生成的 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
Narcolessico 的答案对我有用,但我花了一些时间才完全理解该方法。我将添加到上面提供的答案。
注意: 我正在使用 Java (Apache HttpClient) 向 Confluence 服务器执行 HTTP GET 请求。
禁用自动重定向处理的代码如下。
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,这是您可能需要解决的另一个问题。
顺便说一句,如果您要对上述 url 执行 CURL GET,您会得到如下响应。
上述 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