```java title="Usage.java"
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;
import com.google.gson.JsonParser;

public final class Usage {
  private static final String BOUNDARY = "----WebKitFormBoundary" + UUID.randomUUID();
  private final String containerName;
  private final int apiPort;

  public Usage(String containerName, int apiPort) {
    this.containerName = containerName;
    this.apiPort = apiPort;
  }

  public void startContainer(String image) throws IOException, InterruptedException {
    System.out.println("Starting Kreuzberg Docker container...");
    ProcessBuilder pb = new ProcessBuilder("docker", "run", "-d",
      "--name", containerName,
      "-p", apiPort + ":8000",
      image);
    Process process = pb.start();
    if (process.waitFor() != 0) {
      throw new RuntimeException("Failed to start container");
    }
    System.out.println("Container started on http://localhost:" + apiPort);
  }

  public String extractFile(String filePath) throws IOException {
    byte[] fileBytes = Files.readAllBytes(Paths.get(filePath));
    String fileName = Paths.get(filePath).getFileName().toString();

    URL url = new URL("http://localhost:" + apiPort + "/api/extract");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
    conn.setDoOutput(true);

    try (OutputStream os = conn.getOutputStream()) {
      os.write(("--" + BOUNDARY + "\r\n").getBytes());
      os.write(("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n").getBytes());
      os.write("Content-Type: application/octet-stream\r\n\r\n".getBytes());
      os.write(fileBytes);
      os.write(("\r\n--" + BOUNDARY + "--\r\n").getBytes());
    }

    StringBuilder response = new StringBuilder();
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
      String line;
      while ((line = reader.readLine()) != null) {
        response.append(line);
      }
    }

    return JsonParser.parseString(response.toString())
      .getAsJsonObject()
      .get("content")
      .getAsString();
  }

  public void stopContainer() throws IOException, InterruptedException {
    System.out.println("Stopping Kreuzberg Docker container...");
    new ProcessBuilder("docker", "stop", containerName).start().waitFor();
    new ProcessBuilder("docker", "rm", containerName).start().waitFor();
    System.out.println("Container stopped and removed");
  }

  public static void main(String[] args) throws Exception {
    Usage docker = new Usage("kreuzberg-api", 8000);

    try {
      docker.startContainer("kreuzberg:latest");
      Thread.sleep(2000);

      String content = docker.extractFile("document.pdf");
      System.out.println("Extracted content:\n" + content);
    } finally {
      docker.stopContainer();
    }
  }
}
```
