+
+A read, not a mutation: the source document is untouched and no event is published. Body is `{"pageObjectNumbers": number[]}`; the response body is the new PDF.
+
+
+**documentPassword:** `Optional` — Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+
+
+
+Multipart mutation envelope: a `body` field holding `{"destIndex"?: number}` (omitted → append) plus a `resource:source` file part carrying the standalone PDF whose pages are copied in. The inserted copies get fresh page object numbers, returned in insertion order.
+
+
+**documentPassword:** `Optional` — Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+
+
+
+**documentPassword:** `Optional` — Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+
+
+
+
+
+
+
+**request:** `Map`
+
+
+
+
+
+
+
diff --git a/src/main/java/api/core/ClientOptions.java b/src/main/java/api/core/ClientOptions.java
index 24375b2..bce99f0 100644
--- a/src/main/java/api/core/ClientOptions.java
+++ b/src/main/java/api/core/ClientOptions.java
@@ -49,7 +49,7 @@ private ClientOptions(
{
put("X-Fern-Language", "JAVA");
put("X-Fern-SDK-Name", "com.cloudpdf:sdk");
- put("X-Fern-SDK-Version", "3.0.0-alpha.8");
+ put("X-Fern-SDK-Version", "3.0.0-alpha.9");
}
});
this.headerSuppliers = headerSuppliers;
diff --git a/src/main/java/api/resources/doc/pages/AsyncPagesClient.java b/src/main/java/api/resources/doc/pages/AsyncPagesClient.java
index 7c71600..4a48e5e 100644
--- a/src/main/java/api/resources/doc/pages/AsyncPagesClient.java
+++ b/src/main/java/api/resources/doc/pages/AsyncPagesClient.java
@@ -6,15 +6,23 @@
import com.cloudpdf.api.core.ClientOptions;
import com.cloudpdf.api.core.RequestOptions;
import com.cloudpdf.api.resources.doc.pages.requests.DeletePagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.ExtractPagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.FlattenPagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.InsertBlankPagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.InsertPagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.MovePagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.RotatePagesRequest;
import com.cloudpdf.api.types.DocPagesDelete200Response;
import com.cloudpdf.api.types.DocPagesFlatten200Response;
+import com.cloudpdf.api.types.DocPagesInsert200Response;
+import com.cloudpdf.api.types.DocPagesInsertBlank200Response;
import com.cloudpdf.api.types.DocPagesMove200Response;
import com.cloudpdf.api.types.DocPagesRotate200Response;
+import java.io.File;
+import java.io.InputStream;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
+import okhttp3.MediaType;
public class AsyncPagesClient {
protected final ClientOptions clientOptions;
@@ -53,6 +61,36 @@ public CompletableFuture delete(
return this.rawClient.delete(docId, layerName, request, requestOptions).thenApply(response -> response.body());
}
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CompletableFuture extract(String docId, String layerName, Map body) {
+ return this.rawClient.extract(docId, layerName, body).thenApply(response -> response.body());
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CompletableFuture extract(
+ String docId, String layerName, Map body, RequestOptions requestOptions) {
+ return this.rawClient.extract(docId, layerName, body, requestOptions).thenApply(response -> response.body());
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CompletableFuture extract(String docId, String layerName, ExtractPagesRequest request) {
+ return this.rawClient.extract(docId, layerName, request).thenApply(response -> response.body());
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CompletableFuture extract(
+ String docId, String layerName, ExtractPagesRequest request, RequestOptions requestOptions) {
+ return this.rawClient.extract(docId, layerName, request, requestOptions).thenApply(response -> response.body());
+ }
+
public CompletableFuture flatten(
String docId, String layerName, Map body) {
return this.rawClient.flatten(docId, layerName, body).thenApply(response -> response.body());
@@ -73,6 +111,91 @@ public CompletableFuture flatten(
return this.rawClient.flatten(docId, layerName, request, requestOptions).thenApply(response -> response.body());
}
+ /**
+ * Multipart mutation envelope: a body field holding {"destIndex"?: number} (omitted → append) plus a resource:source file part carrying the standalone PDF whose pages are copied in. The inserted copies get fresh page object numbers, returned in insertion order.
+ */
+ public CompletableFuture insert(
+ String docId, String layerName, File file, InsertPagesRequest request) {
+ return this.rawClient.insert(docId, layerName, file, request).thenApply(response -> response.body());
+ }
+
+ /**
+ * Multipart mutation envelope: a body field holding {"destIndex"?: number} (omitted → append) plus a resource:source file part carrying the standalone PDF whose pages are copied in. The inserted copies get fresh page object numbers, returned in insertion order.
+ */
+ public CompletableFuture insert(
+ String docId, String layerName, File file, InsertPagesRequest request, RequestOptions requestOptions) {
+ return this.rawClient
+ .insert(docId, layerName, file, request, requestOptions)
+ .thenApply(response -> response.body());
+ }
+
+ public CompletableFuture insert(
+ String docId, String layerName, InputStream stream, String filename) {
+ return this.rawClient.insert(docId, layerName, stream, filename).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture insert(
+ String docId, String layerName, InputStream stream, String filename, MediaType mediaType) {
+ return this.rawClient
+ .insert(docId, layerName, stream, filename, mediaType)
+ .thenApply(response -> response.body());
+ }
+
+ public CompletableFuture insert(
+ String docId, String layerName, InputStream stream, String filename, RequestOptions requestOptions) {
+ return this.rawClient
+ .insert(docId, layerName, stream, filename, requestOptions)
+ .thenApply(response -> response.body());
+ }
+
+ public CompletableFuture insert(
+ String docId,
+ String layerName,
+ InputStream stream,
+ String filename,
+ MediaType mediaType,
+ RequestOptions requestOptions) {
+ return this.rawClient
+ .insert(docId, layerName, stream, filename, mediaType, requestOptions)
+ .thenApply(response -> response.body());
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CompletableFuture insertBlank(
+ String docId, String layerName, Map body) {
+ return this.rawClient.insertBlank(docId, layerName, body).thenApply(response -> response.body());
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CompletableFuture insertBlank(
+ String docId, String layerName, Map body, RequestOptions requestOptions) {
+ return this.rawClient
+ .insertBlank(docId, layerName, body, requestOptions)
+ .thenApply(response -> response.body());
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CompletableFuture insertBlank(
+ String docId, String layerName, InsertBlankPagesRequest request) {
+ return this.rawClient.insertBlank(docId, layerName, request).thenApply(response -> response.body());
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CompletableFuture insertBlank(
+ String docId, String layerName, InsertBlankPagesRequest request, RequestOptions requestOptions) {
+ return this.rawClient
+ .insertBlank(docId, layerName, request, requestOptions)
+ .thenApply(response -> response.body());
+ }
+
public CompletableFuture move(String docId, String layerName, Map body) {
return this.rawClient.move(docId, layerName, body).thenApply(response -> response.body());
}
diff --git a/src/main/java/api/resources/doc/pages/AsyncRawPagesClient.java b/src/main/java/api/resources/doc/pages/AsyncRawPagesClient.java
index 5970637..a314d05 100644
--- a/src/main/java/api/resources/doc/pages/AsyncRawPagesClient.java
+++ b/src/main/java/api/resources/doc/pages/AsyncRawPagesClient.java
@@ -7,28 +7,40 @@
import com.cloudpdf.api.core.CloudPDFApiException;
import com.cloudpdf.api.core.CloudPDFClientHttpResponse;
import com.cloudpdf.api.core.CloudPDFException;
+import com.cloudpdf.api.core.FileStream;
import com.cloudpdf.api.core.MediaTypes;
import com.cloudpdf.api.core.ObjectMappers;
import com.cloudpdf.api.core.RequestOptions;
+import com.cloudpdf.api.core.ResponseBodyInputStream;
import com.cloudpdf.api.core.RetryInterceptor;
import com.cloudpdf.api.errors.BadRequestError;
import com.cloudpdf.api.errors.NotFoundError;
import com.cloudpdf.api.resources.doc.pages.requests.DeletePagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.ExtractPagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.FlattenPagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.InsertBlankPagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.InsertPagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.MovePagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.RotatePagesRequest;
import com.cloudpdf.api.types.DocPagesDelete200Response;
import com.cloudpdf.api.types.DocPagesFlatten200Response;
+import com.cloudpdf.api.types.DocPagesInsert200Response;
+import com.cloudpdf.api.types.DocPagesInsertBlank200Response;
import com.cloudpdf.api.types.DocPagesMove200Response;
import com.cloudpdf.api.types.DocPagesRotate200Response;
import com.fasterxml.jackson.core.JsonProcessingException;
+import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Headers;
import okhttp3.HttpUrl;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
@@ -153,6 +165,129 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) {
return future;
}
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CompletableFuture> extract(
+ String docId, String layerName, Map body) {
+ return extract(
+ docId, layerName, ExtractPagesRequest.builder().body(body).build());
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CompletableFuture> extract(
+ String docId, String layerName, Map body, RequestOptions requestOptions) {
+ return extract(
+ docId, layerName, ExtractPagesRequest.builder().body(body).build(), requestOptions);
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CompletableFuture> extract(
+ String docId, String layerName, ExtractPagesRequest request) {
+ return extract(docId, layerName, request, null);
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CompletableFuture> extract(
+ String docId, String layerName, ExtractPagesRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("extract");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ RequestBody body;
+ try {
+ body = RequestBody.create(
+ ObjectMappers.JSON_MAPPER.writeValueAsBytes(request.getBody()), MediaTypes.APPLICATION_JSON);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("POST", body)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try {
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ future.complete(
+ new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response));
+ return;
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ switch (response.code()) {
+ case 400:
+ future.completeExceptionally(new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ case 404:
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
public CompletableFuture> flatten(
String docId, String layerName, Map body) {
return flatten(
@@ -265,6 +400,553 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) {
return future;
}
+ /**
+ * Multipart mutation envelope: a body field holding {"destIndex"?: number} (omitted → append) plus a resource:source file part carrying the standalone PDF whose pages are copied in. The inserted copies get fresh page object numbers, returned in insertion order.
+ */
+ public CompletableFuture> insert(
+ String docId, String layerName, File file, InsertPagesRequest request) {
+ return insert(docId, layerName, file, request, null);
+ }
+
+ /**
+ * Multipart mutation envelope: a body field holding {"destIndex"?: number} (omitted → append) plus a resource:source file part carrying the standalone PDF whose pages are copied in. The inserted copies get fresh page object numbers, returned in insertion order.
+ */
+ public CompletableFuture> insert(
+ String docId, String layerName, File file, InsertPagesRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ try {
+ String fileMimeType = Files.probeContentType(file.toPath());
+ MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null;
+ multipartBodyBuilder.addFormDataPart(
+ "file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("POST", multipartBodyBuilder.build())
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try (ResponseBody responseBody = response.body()) {
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ future.complete(new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(
+ responseBodyString, DocPagesInsert200Response.class),
+ response));
+ return;
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ future.completeExceptionally(new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ case 404:
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ public CompletableFuture> insert(
+ String docId, String layerName, InputStream stream, String filename) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ FileStream fs = new FileStream(stream, filename, null);
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ multipartBodyBuilder.addFormDataPart("file", filename, fs.toRequestBody());
+ RequestBody body = multipartBodyBuilder.build();
+ Request.Builder _requestBuilder = new Request.Builder();
+ _requestBuilder.url(httpUrl.build());
+ _requestBuilder.method("POST", body);
+ _requestBuilder.headers(Headers.of(this.clientOptions.headers((RequestOptions) null)));
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try (ResponseBody responseBody = response.body()) {
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ future.complete(new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(
+ responseBodyString, DocPagesInsert200Response.class),
+ response));
+ return;
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ future.completeExceptionally(new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ case 404:
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ public CompletableFuture> insert(
+ String docId, String layerName, InputStream stream, String filename, MediaType mediaType) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ FileStream fs = new FileStream(stream, filename, mediaType);
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ multipartBodyBuilder.addFormDataPart("file", filename, fs.toRequestBody());
+ RequestBody body = multipartBodyBuilder.build();
+ Request.Builder _requestBuilder = new Request.Builder();
+ _requestBuilder.url(httpUrl.build());
+ _requestBuilder.method("POST", body);
+ _requestBuilder.headers(Headers.of(this.clientOptions.headers((RequestOptions) null)));
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try (ResponseBody responseBody = response.body()) {
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ future.complete(new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(
+ responseBodyString, DocPagesInsert200Response.class),
+ response));
+ return;
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ future.completeExceptionally(new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ case 404:
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ public CompletableFuture> insert(
+ String docId, String layerName, InputStream stream, String filename, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ FileStream fs = new FileStream(stream, filename, null);
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ multipartBodyBuilder.addFormDataPart("file", filename, fs.toRequestBody());
+ RequestBody body = multipartBodyBuilder.build();
+ Request.Builder _requestBuilder = new Request.Builder();
+ _requestBuilder.url(httpUrl.build());
+ _requestBuilder.method("POST", body);
+ _requestBuilder.headers(Headers.of(this.clientOptions.headers(requestOptions)));
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try (ResponseBody responseBody = response.body()) {
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ future.complete(new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(
+ responseBodyString, DocPagesInsert200Response.class),
+ response));
+ return;
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ future.completeExceptionally(new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ case 404:
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ public CompletableFuture> insert(
+ String docId,
+ String layerName,
+ InputStream stream,
+ String filename,
+ MediaType mediaType,
+ RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ FileStream fs = new FileStream(stream, filename, mediaType);
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ multipartBodyBuilder.addFormDataPart("file", filename, fs.toRequestBody());
+ RequestBody body = multipartBodyBuilder.build();
+ Request.Builder _requestBuilder = new Request.Builder();
+ _requestBuilder.url(httpUrl.build());
+ _requestBuilder.method("POST", body);
+ _requestBuilder.headers(Headers.of(this.clientOptions.headers(requestOptions)));
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try (ResponseBody responseBody = response.body()) {
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ future.complete(new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(
+ responseBodyString, DocPagesInsert200Response.class),
+ response));
+ return;
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ future.completeExceptionally(new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ case 404:
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CompletableFuture> insertBlank(
+ String docId, String layerName, Map body) {
+ return insertBlank(
+ docId, layerName, InsertBlankPagesRequest.builder().body(body).build());
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CompletableFuture> insertBlank(
+ String docId, String layerName, Map body, RequestOptions requestOptions) {
+ return insertBlank(
+ docId, layerName, InsertBlankPagesRequest.builder().body(body).build(), requestOptions);
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CompletableFuture> insertBlank(
+ String docId, String layerName, InsertBlankPagesRequest request) {
+ return insertBlank(docId, layerName, request, null);
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CompletableFuture> insertBlank(
+ String docId, String layerName, InsertBlankPagesRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert-blank");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ RequestBody body;
+ try {
+ body = RequestBody.create(
+ ObjectMappers.JSON_MAPPER.writeValueAsBytes(request.getBody()), MediaTypes.APPLICATION_JSON);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("POST", body)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future =
+ new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try (ResponseBody responseBody = response.body()) {
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ future.complete(new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(
+ responseBodyString, DocPagesInsertBlank200Response.class),
+ response));
+ return;
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ future.completeExceptionally(new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ case 404:
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
public CompletableFuture> move(
String docId, String layerName, Map body) {
return move(docId, layerName, MovePagesRequest.builder().body(body).build());
diff --git a/src/main/java/api/resources/doc/pages/PagesClient.java b/src/main/java/api/resources/doc/pages/PagesClient.java
index 1dd7e2f..bfa2e68 100644
--- a/src/main/java/api/resources/doc/pages/PagesClient.java
+++ b/src/main/java/api/resources/doc/pages/PagesClient.java
@@ -6,14 +6,22 @@
import com.cloudpdf.api.core.ClientOptions;
import com.cloudpdf.api.core.RequestOptions;
import com.cloudpdf.api.resources.doc.pages.requests.DeletePagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.ExtractPagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.FlattenPagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.InsertBlankPagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.InsertPagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.MovePagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.RotatePagesRequest;
import com.cloudpdf.api.types.DocPagesDelete200Response;
import com.cloudpdf.api.types.DocPagesFlatten200Response;
+import com.cloudpdf.api.types.DocPagesInsert200Response;
+import com.cloudpdf.api.types.DocPagesInsertBlank200Response;
import com.cloudpdf.api.types.DocPagesMove200Response;
import com.cloudpdf.api.types.DocPagesRotate200Response;
+import java.io.File;
+import java.io.InputStream;
import java.util.Map;
+import okhttp3.MediaType;
public class PagesClient {
protected final ClientOptions clientOptions;
@@ -50,6 +58,36 @@ public DocPagesDelete200Response delete(
return this.rawClient.delete(docId, layerName, request, requestOptions).body();
}
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public InputStream extract(String docId, String layerName, Map body) {
+ return this.rawClient.extract(docId, layerName, body).body();
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public InputStream extract(
+ String docId, String layerName, Map body, RequestOptions requestOptions) {
+ return this.rawClient.extract(docId, layerName, body, requestOptions).body();
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public InputStream extract(String docId, String layerName, ExtractPagesRequest request) {
+ return this.rawClient.extract(docId, layerName, request).body();
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public InputStream extract(
+ String docId, String layerName, ExtractPagesRequest request, RequestOptions requestOptions) {
+ return this.rawClient.extract(docId, layerName, request, requestOptions).body();
+ }
+
public DocPagesFlatten200Response flatten(String docId, String layerName, Map body) {
return this.rawClient.flatten(docId, layerName, body).body();
}
@@ -68,6 +106,87 @@ public DocPagesFlatten200Response flatten(
return this.rawClient.flatten(docId, layerName, request, requestOptions).body();
}
+ /**
+ * Multipart mutation envelope: a body field holding {"destIndex"?: number} (omitted → append) plus a resource:source file part carrying the standalone PDF whose pages are copied in. The inserted copies get fresh page object numbers, returned in insertion order.
+ */
+ public DocPagesInsert200Response insert(String docId, String layerName, File file, InsertPagesRequest request) {
+ return this.rawClient.insert(docId, layerName, file, request).body();
+ }
+
+ /**
+ * Multipart mutation envelope: a body field holding {"destIndex"?: number} (omitted → append) plus a resource:source file part carrying the standalone PDF whose pages are copied in. The inserted copies get fresh page object numbers, returned in insertion order.
+ */
+ public DocPagesInsert200Response insert(
+ String docId, String layerName, File file, InsertPagesRequest request, RequestOptions requestOptions) {
+ return this.rawClient
+ .insert(docId, layerName, file, request, requestOptions)
+ .body();
+ }
+
+ public DocPagesInsert200Response insert(String docId, String layerName, InputStream stream, String filename) {
+ return this.rawClient.insert(docId, layerName, stream, filename).body();
+ }
+
+ public DocPagesInsert200Response insert(
+ String docId, String layerName, InputStream stream, String filename, MediaType mediaType) {
+ return this.rawClient
+ .insert(docId, layerName, stream, filename, mediaType)
+ .body();
+ }
+
+ public DocPagesInsert200Response insert(
+ String docId, String layerName, InputStream stream, String filename, RequestOptions requestOptions) {
+ return this.rawClient
+ .insert(docId, layerName, stream, filename, requestOptions)
+ .body();
+ }
+
+ public DocPagesInsert200Response insert(
+ String docId,
+ String layerName,
+ InputStream stream,
+ String filename,
+ MediaType mediaType,
+ RequestOptions requestOptions) {
+ return this.rawClient
+ .insert(docId, layerName, stream, filename, mediaType, requestOptions)
+ .body();
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public DocPagesInsertBlank200Response insertBlank(String docId, String layerName, Map body) {
+ return this.rawClient.insertBlank(docId, layerName, body).body();
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public DocPagesInsertBlank200Response insertBlank(
+ String docId, String layerName, Map body, RequestOptions requestOptions) {
+ return this.rawClient
+ .insertBlank(docId, layerName, body, requestOptions)
+ .body();
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public DocPagesInsertBlank200Response insertBlank(String docId, String layerName, InsertBlankPagesRequest request) {
+ return this.rawClient.insertBlank(docId, layerName, request).body();
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public DocPagesInsertBlank200Response insertBlank(
+ String docId, String layerName, InsertBlankPagesRequest request, RequestOptions requestOptions) {
+ return this.rawClient
+ .insertBlank(docId, layerName, request, requestOptions)
+ .body();
+ }
+
public DocPagesMove200Response move(String docId, String layerName, Map body) {
return this.rawClient.move(docId, layerName, body).body();
}
diff --git a/src/main/java/api/resources/doc/pages/RawPagesClient.java b/src/main/java/api/resources/doc/pages/RawPagesClient.java
index 411e15d..2a46ae6 100644
--- a/src/main/java/api/resources/doc/pages/RawPagesClient.java
+++ b/src/main/java/api/resources/doc/pages/RawPagesClient.java
@@ -7,25 +7,37 @@
import com.cloudpdf.api.core.CloudPDFApiException;
import com.cloudpdf.api.core.CloudPDFClientHttpResponse;
import com.cloudpdf.api.core.CloudPDFException;
+import com.cloudpdf.api.core.FileStream;
import com.cloudpdf.api.core.MediaTypes;
import com.cloudpdf.api.core.ObjectMappers;
import com.cloudpdf.api.core.RequestOptions;
+import com.cloudpdf.api.core.ResponseBodyInputStream;
import com.cloudpdf.api.core.RetryInterceptor;
import com.cloudpdf.api.errors.BadRequestError;
import com.cloudpdf.api.errors.NotFoundError;
import com.cloudpdf.api.resources.doc.pages.requests.DeletePagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.ExtractPagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.FlattenPagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.InsertBlankPagesRequest;
+import com.cloudpdf.api.resources.doc.pages.requests.InsertPagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.MovePagesRequest;
import com.cloudpdf.api.resources.doc.pages.requests.RotatePagesRequest;
import com.cloudpdf.api.types.DocPagesDelete200Response;
import com.cloudpdf.api.types.DocPagesFlatten200Response;
+import com.cloudpdf.api.types.DocPagesInsert200Response;
+import com.cloudpdf.api.types.DocPagesInsertBlank200Response;
import com.cloudpdf.api.types.DocPagesMove200Response;
import com.cloudpdf.api.types.DocPagesRotate200Response;
import com.fasterxml.jackson.core.JsonProcessingException;
+import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
import java.util.Map;
import okhttp3.Headers;
import okhttp3.HttpUrl;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
@@ -130,6 +142,109 @@ public CloudPDFClientHttpResponse delete(
}
}
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CloudPDFClientHttpResponse extract(String docId, String layerName, Map body) {
+ return extract(
+ docId, layerName, ExtractPagesRequest.builder().body(body).build());
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CloudPDFClientHttpResponse extract(
+ String docId, String layerName, Map body, RequestOptions requestOptions) {
+ return extract(
+ docId, layerName, ExtractPagesRequest.builder().body(body).build(), requestOptions);
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CloudPDFClientHttpResponse extract(
+ String docId, String layerName, ExtractPagesRequest request) {
+ return extract(docId, layerName, request, null);
+ }
+
+ /**
+ * A read, not a mutation: the source document is untouched and no event is published. Body is {"pageObjectNumbers": number[]}; the response body is the new PDF.
+ */
+ public CloudPDFClientHttpResponse extract(
+ String docId, String layerName, ExtractPagesRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("extract");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ RequestBody body;
+ try {
+ body = RequestBody.create(
+ ObjectMappers.JSON_MAPPER.writeValueAsBytes(request.getBody()), MediaTypes.APPLICATION_JSON);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("POST", body)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try {
+ Response response = client.newCall(okhttpRequest).execute();
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response);
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ switch (response.code()) {
+ case 400:
+ throw new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ case 404:
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
public CloudPDFClientHttpResponse flatten(
String docId, String layerName, Map body) {
return flatten(
@@ -223,6 +338,438 @@ public CloudPDFClientHttpResponse flatten(
}
}
+ /**
+ * Multipart mutation envelope: a body field holding {"destIndex"?: number} (omitted → append) plus a resource:source file part carrying the standalone PDF whose pages are copied in. The inserted copies get fresh page object numbers, returned in insertion order.
+ */
+ public CloudPDFClientHttpResponse insert(
+ String docId, String layerName, File file, InsertPagesRequest request) {
+ return insert(docId, layerName, file, request, null);
+ }
+
+ /**
+ * Multipart mutation envelope: a body field holding {"destIndex"?: number} (omitted → append) plus a resource:source file part carrying the standalone PDF whose pages are copied in. The inserted copies get fresh page object numbers, returned in insertion order.
+ */
+ public CloudPDFClientHttpResponse insert(
+ String docId, String layerName, File file, InsertPagesRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ try {
+ String fileMimeType = Files.probeContentType(file.toPath());
+ MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null;
+ multipartBodyBuilder.addFormDataPart(
+ "file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("POST", multipartBodyBuilder.build())
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try (Response response = client.newCall(okhttpRequest).execute()) {
+ ResponseBody responseBody = response.body();
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DocPagesInsert200Response.class),
+ response);
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ throw new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ case 404:
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ public CloudPDFClientHttpResponse insert(
+ String docId, String layerName, InputStream stream, String filename) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ FileStream fs = new FileStream(stream, filename, null);
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ multipartBodyBuilder.addFormDataPart("file", filename, fs.toRequestBody());
+ RequestBody body = multipartBodyBuilder.build();
+ Request.Builder _requestBuilder = new Request.Builder();
+ _requestBuilder.url(httpUrl.build());
+ _requestBuilder.method("POST", body);
+ _requestBuilder.headers(Headers.of(this.clientOptions.headers((RequestOptions) null)));
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ try (Response response = client.newCall(okhttpRequest).execute()) {
+ ResponseBody responseBody = response.body();
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DocPagesInsert200Response.class),
+ response);
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ throw new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ case 404:
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ public CloudPDFClientHttpResponse insert(
+ String docId, String layerName, InputStream stream, String filename, MediaType mediaType) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ FileStream fs = new FileStream(stream, filename, mediaType);
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ multipartBodyBuilder.addFormDataPart("file", filename, fs.toRequestBody());
+ RequestBody body = multipartBodyBuilder.build();
+ Request.Builder _requestBuilder = new Request.Builder();
+ _requestBuilder.url(httpUrl.build());
+ _requestBuilder.method("POST", body);
+ _requestBuilder.headers(Headers.of(this.clientOptions.headers((RequestOptions) null)));
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ try (Response response = client.newCall(okhttpRequest).execute()) {
+ ResponseBody responseBody = response.body();
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DocPagesInsert200Response.class),
+ response);
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ throw new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ case 404:
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ public CloudPDFClientHttpResponse insert(
+ String docId, String layerName, InputStream stream, String filename, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ FileStream fs = new FileStream(stream, filename, null);
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ multipartBodyBuilder.addFormDataPart("file", filename, fs.toRequestBody());
+ RequestBody body = multipartBodyBuilder.build();
+ Request.Builder _requestBuilder = new Request.Builder();
+ _requestBuilder.url(httpUrl.build());
+ _requestBuilder.method("POST", body);
+ _requestBuilder.headers(Headers.of(this.clientOptions.headers(requestOptions)));
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try (Response response = client.newCall(okhttpRequest).execute()) {
+ ResponseBody responseBody = response.body();
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DocPagesInsert200Response.class),
+ response);
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ throw new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ case 404:
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ public CloudPDFClientHttpResponse insert(
+ String docId,
+ String layerName,
+ InputStream stream,
+ String filename,
+ MediaType mediaType,
+ RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ FileStream fs = new FileStream(stream, filename, mediaType);
+ MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+ multipartBodyBuilder.addFormDataPart("file", filename, fs.toRequestBody());
+ RequestBody body = multipartBodyBuilder.build();
+ Request.Builder _requestBuilder = new Request.Builder();
+ _requestBuilder.url(httpUrl.build());
+ _requestBuilder.method("POST", body);
+ _requestBuilder.headers(Headers.of(this.clientOptions.headers(requestOptions)));
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try (Response response = client.newCall(okhttpRequest).execute()) {
+ ResponseBody responseBody = response.body();
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DocPagesInsert200Response.class),
+ response);
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ throw new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ case 404:
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CloudPDFClientHttpResponse insertBlank(
+ String docId, String layerName, Map body) {
+ return insertBlank(
+ docId, layerName, InsertBlankPagesRequest.builder().body(body).build());
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CloudPDFClientHttpResponse insertBlank(
+ String docId, String layerName, Map body, RequestOptions requestOptions) {
+ return insertBlank(
+ docId, layerName, InsertBlankPagesRequest.builder().body(body).build(), requestOptions);
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CloudPDFClientHttpResponse insertBlank(
+ String docId, String layerName, InsertBlankPagesRequest request) {
+ return insertBlank(docId, layerName, request, null);
+ }
+
+ /**
+ * Body is {"size": {"width", "height"}, "count"?, "destIndex"?} — size in PDF points, count in [1, 100], destIndex omitted → append.
+ */
+ public CloudPDFClientHttpResponse insertBlank(
+ String docId, String layerName, InsertBlankPagesRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("layers")
+ .addPathSegment(layerName)
+ .addPathSegments("pages")
+ .addPathSegments("insert-blank");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ RequestBody body;
+ try {
+ body = RequestBody.create(
+ ObjectMappers.JSON_MAPPER.writeValueAsBytes(request.getBody()), MediaTypes.APPLICATION_JSON);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("POST", body)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try (Response response = client.newCall(okhttpRequest).execute()) {
+ ResponseBody responseBody = response.body();
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DocPagesInsertBlank200Response.class),
+ response);
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ throw new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ case 404:
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
public CloudPDFClientHttpResponse move(
String docId, String layerName, Map body) {
return move(docId, layerName, MovePagesRequest.builder().body(body).build());
diff --git a/src/main/java/api/resources/doc/pages/requests/ExtractPagesRequest.java b/src/main/java/api/resources/doc/pages/requests/ExtractPagesRequest.java
new file mode 100644
index 0000000..ae9ba09
--- /dev/null
+++ b/src/main/java/api/resources/doc/pages/requests/ExtractPagesRequest.java
@@ -0,0 +1,145 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.pages.requests;
+
+import com.cloudpdf.api.core.ObjectMappers;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = ExtractPagesRequest.Builder.class)
+public final class ExtractPagesRequest {
+ private final Optional documentPassword;
+
+ private final Map body;
+
+ private final Map additionalProperties;
+
+ private ExtractPagesRequest(
+ Optional documentPassword, Map body, Map additionalProperties) {
+ this.documentPassword = documentPassword;
+ this.body = body;
+ this.additionalProperties = additionalProperties;
+ }
+
+ /**
+ * @return Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ @JsonIgnore
+ public Optional getDocumentPassword() {
+ return documentPassword;
+ }
+
+ @JsonProperty("body")
+ public Map getBody() {
+ return body;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof ExtractPagesRequest && equalTo((ExtractPagesRequest) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(ExtractPagesRequest other) {
+ return documentPassword.equals(other.documentPassword) && body.equals(other.body);
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.documentPassword, this.body);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder {
+ private Optional documentPassword = Optional.empty();
+
+ private Map body = new LinkedHashMap<>();
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ public Builder from(ExtractPagesRequest other) {
+ documentPassword(other.getDocumentPassword());
+ body(other.getBody());
+ return this;
+ }
+
+ /**
+ *
Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ public Builder documentPassword(Optional documentPassword) {
+ this.documentPassword = documentPassword;
+ return this;
+ }
+
+ public Builder documentPassword(String documentPassword) {
+ this.documentPassword = Optional.ofNullable(documentPassword);
+ return this;
+ }
+
+ @JsonSetter(value = "body", nulls = Nulls.SKIP)
+ public Builder body(Map body) {
+ this.body.clear();
+ if (body != null) {
+ this.body.putAll(body);
+ }
+ return this;
+ }
+
+ public Builder putAllBody(Map body) {
+ if (body != null) {
+ this.body.putAll(body);
+ }
+ return this;
+ }
+
+ public Builder body(String key, Object value) {
+ this.body.put(key, value);
+ return this;
+ }
+
+ public ExtractPagesRequest build() {
+ return new ExtractPagesRequest(documentPassword, body, additionalProperties);
+ }
+
+ public Builder additionalProperty(String key, Object value) {
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ public Builder additionalProperties(Map additionalProperties) {
+ this.additionalProperties.putAll(additionalProperties);
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/api/resources/doc/pages/requests/InsertBlankPagesRequest.java b/src/main/java/api/resources/doc/pages/requests/InsertBlankPagesRequest.java
new file mode 100644
index 0000000..e332722
--- /dev/null
+++ b/src/main/java/api/resources/doc/pages/requests/InsertBlankPagesRequest.java
@@ -0,0 +1,145 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.pages.requests;
+
+import com.cloudpdf.api.core.ObjectMappers;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = InsertBlankPagesRequest.Builder.class)
+public final class InsertBlankPagesRequest {
+ private final Optional documentPassword;
+
+ private final Map body;
+
+ private final Map additionalProperties;
+
+ private InsertBlankPagesRequest(
+ Optional documentPassword, Map body, Map additionalProperties) {
+ this.documentPassword = documentPassword;
+ this.body = body;
+ this.additionalProperties = additionalProperties;
+ }
+
+ /**
+ * @return Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ @JsonIgnore
+ public Optional getDocumentPassword() {
+ return documentPassword;
+ }
+
+ @JsonProperty("body")
+ public Map getBody() {
+ return body;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof InsertBlankPagesRequest && equalTo((InsertBlankPagesRequest) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(InsertBlankPagesRequest other) {
+ return documentPassword.equals(other.documentPassword) && body.equals(other.body);
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.documentPassword, this.body);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder {
+ private Optional documentPassword = Optional.empty();
+
+ private Map body = new LinkedHashMap<>();
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ public Builder from(InsertBlankPagesRequest other) {
+ documentPassword(other.getDocumentPassword());
+ body(other.getBody());
+ return this;
+ }
+
+ /**
+ *
Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ public Builder documentPassword(Optional documentPassword) {
+ this.documentPassword = documentPassword;
+ return this;
+ }
+
+ public Builder documentPassword(String documentPassword) {
+ this.documentPassword = Optional.ofNullable(documentPassword);
+ return this;
+ }
+
+ @JsonSetter(value = "body", nulls = Nulls.SKIP)
+ public Builder body(Map body) {
+ this.body.clear();
+ if (body != null) {
+ this.body.putAll(body);
+ }
+ return this;
+ }
+
+ public Builder putAllBody(Map body) {
+ if (body != null) {
+ this.body.putAll(body);
+ }
+ return this;
+ }
+
+ public Builder body(String key, Object value) {
+ this.body.put(key, value);
+ return this;
+ }
+
+ public InsertBlankPagesRequest build() {
+ return new InsertBlankPagesRequest(documentPassword, body, additionalProperties);
+ }
+
+ public Builder additionalProperty(String key, Object value) {
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ public Builder additionalProperties(Map additionalProperties) {
+ this.additionalProperties.putAll(additionalProperties);
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/api/resources/doc/pages/requests/InsertPagesRequest.java b/src/main/java/api/resources/doc/pages/requests/InsertPagesRequest.java
new file mode 100644
index 0000000..a47130d
--- /dev/null
+++ b/src/main/java/api/resources/doc/pages/requests/InsertPagesRequest.java
@@ -0,0 +1,108 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.pages.requests;
+
+import com.cloudpdf.api.core.ObjectMappers;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = InsertPagesRequest.Builder.class)
+public final class InsertPagesRequest {
+ private final Optional documentPassword;
+
+ private final Map additionalProperties;
+
+ private InsertPagesRequest(Optional documentPassword, Map additionalProperties) {
+ this.documentPassword = documentPassword;
+ this.additionalProperties = additionalProperties;
+ }
+
+ /**
+ * @return Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ @JsonIgnore
+ public Optional getDocumentPassword() {
+ return documentPassword;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof InsertPagesRequest && equalTo((InsertPagesRequest) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(InsertPagesRequest other) {
+ return documentPassword.equals(other.documentPassword);
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.documentPassword);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder {
+ private Optional documentPassword = Optional.empty();
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ public Builder from(InsertPagesRequest other) {
+ documentPassword(other.getDocumentPassword());
+ return this;
+ }
+
+ /**
+ *
Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ public Builder documentPassword(Optional documentPassword) {
+ this.documentPassword = documentPassword;
+ return this;
+ }
+
+ public Builder documentPassword(String documentPassword) {
+ this.documentPassword = Optional.ofNullable(documentPassword);
+ return this;
+ }
+
+ public InsertPagesRequest build() {
+ return new InsertPagesRequest(documentPassword, additionalProperties);
+ }
+
+ public Builder additionalProperty(String key, Object value) {
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ public Builder additionalProperties(Map additionalProperties) {
+ this.additionalProperties.putAll(additionalProperties);
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/api/types/DocPagesExtract400Response.java b/src/main/java/api/types/DocPagesExtract400Response.java
new file mode 100644
index 0000000..5a3e557
--- /dev/null
+++ b/src/main/java/api/types/DocPagesExtract400Response.java
@@ -0,0 +1,200 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.types;
+
+import com.cloudpdf.api.core.ObjectMappers;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import org.jetbrains.annotations.NotNull;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = DocPagesExtract400Response.Builder.class)
+public final class DocPagesExtract400Response {
+ private final DocPagesExtract400ResponseName name;
+
+ private final DocPagesExtract400ResponseCode code;
+
+ private final String message;
+
+ private final Optional