Я предполагаю, что проблема возникает во время передачи, поскольку URI плохо справляется с двоичными данными - там могут быть символы NUL и кто знает, что еще там, которые обрезают или портят данные. Вместо этого попробуйте отправить эти данные следующим образом (в виде необработанного текста вместо URL-кода):
var x = new XMLHttpRequest();
x.open("POST", "xxx/mail.php", true);
x.setRequestHeader("Content-type", "text/plain; charset=utf-8");
x.send( new Uint8Array(pdfcontent) );
Затем на стороне сервера необходимо извлечь эти необработанные данные следующим образом:
$data = file_get_contents('php://input');
Использование $ _POST не будет работать, оно должно быть пустым.
Если это все равно приводит к повреждению файла, возможно, проблема не в передаче. Попробуйте скопировать + вставить любой файл console.log, распечатанный в файл, и посмотреть, можно ли его открыть (он может не работать, даже если данные действительны, поскольку работали с двоичными данными, но если он работает, то отлично - при по крайней мере, мы можем исключить проблему у источника). Затем попытайтесь сохранить данные на стороне сервера, используя file-put-contents (https://www.php.net/manual/en/function.file-put-contents.php), и посмотрите, дает ли это допустимый файл. Если это произойдет, то проблема возникает во время отправки по электронной почте.
В любом случае, вам действительно следует создавать файлы на стороне сервера - все это туда-сюда ужасно неэффективно и ужасно небезопасно. Например, вы можете использовать FPDF (http://www.fpdf.org/), чтобы создать файл PDF с нуля, используя PHP, и сразу же отправить его по электронной почте. Да, это удваивает ваши усилия по выводу, так как вам нужно производить HTML и PDF отдельно, но в конечном итоге это того стоит. Или, возможно, вам вообще не нужно производить HTML в этой настройке? Вы производите HTML с единственной целью - отправить его по электронной почте или вам действительно нужно представить его пользователю?