How can I send a binary data (blob) using fetch and FormData?

If you want to send a binary file, do not use the .text() method, as that returns the file decoded using UTF-8, which is not what you want. Instead, use the .blob() method, which does not attempt to decode the file, and use it directly as the body parameter of the second fetch() since it's allowed to be a Blob:

const response = await fetch("https://wiki.epfl.ch/lapa-studio/documents/DTS/laser%20tutorial.pdf");
const content = await response.blob();
console.log(content.size);
fetch("https://wiki.epfl.ch/test.php", { method: 'POST', body: content });

For parsing this upload format see this answer.

If you want to upload it as part of a multipart/form-data formatted attachment, you can still use the FormData API, but doing so isn't necessary to send the binary data to your PHP script. Just for completeness, here's how you'd do that instead:

const response = await fetch("https://wiki.epfl.ch/lapa-studio/documents/DTS/laser%20tutorial.pdf");
const content = await response.blob();
console.log(content.size);
const formData = new FormData();
formData.append("content", content);
fetch("https://wiki.epfl.ch/test.php", { method: 'POST', body: formData });

Try this, by converting blob to DataURL string, you can send binary data without being modified.

response = await fetch("https://wiki.epfl.ch/lapa-studio/documents/DTS/laser%20tutorial.pdf");
response.blob().then(function (content) {

    let reader = new FileReader();

    reader.addEventListener("loadend", function () {

      formData = new FormData();
      formData.append("content", reader.result);
      fetch("https://wiki.epfl.ch/test.php", { method: 'POST', body: formData });
      reader.removeEventListener("loadend");

    });

    reader.readAsDataURL(content);

 });