Я сделал 2 ошибки:
1) выше апи 29 получать абсолютный путь нельзя (изменили из соображений безопасности) - поэтому выходила ошибка No such file or directory, нужно копировать файл в кеш папку приложения.
2) pdf файл нужно не только создать но и записать туда данные, а я только создал (и после того как исправил ошибку еще долго искал почему на сервер приходит пустой файл).
Итого решение выглядит так (основные шаги)
1) Запускаю окно выбора файла:
Intentval pdfIntent = Intent(Intent.ACTION_GET_CONTENT)
pdfIntent.type = "application/pdf"
pdfIntent.addCategory(Intent.CATEGORY_OPENABLE)
startActivityForResult(pdfIntent, 12)
2) Переопределяю fun onActivityResult, в ней из полученной в ней data получаю uri и отправляю его сначала в функцию getDriveFilePath(uri)
val uri = data.data
Функция getDriveFilePath создает 2 File() и 2 stream и копирует данные по stream в файл в кеш директории (если не скопировать данные, а только создать файл, на сервер придет пустой файл, и еще важно копировать данные как для символьного файла, а не как для картинки, иначе тоже будет пустой файл).
Функция getDriveFilePath
val file = File(requireContext().getCacheDir(), name)
try {
val instream: InputStream = requireContext().getContentResolver().openInputStream(uri)!!
val output = FileOutputStream(file)
val buffer = ByteArray(1024)
var size: Int
while (instream.read(buffer).also { size = it } != -1) {
output.write(buffer, 0, size)
}
instream.close()
output.close()
} catch (e: IOException) {
Log.d("TAG1", "e: ${e}")
}
3) Отправляем полученный file в retrofit функцию, прикрепляем его к запросу и все.
file.asRequestBody("application/pdf".toMediaTypeOrNull())
Надеюсь это кому-то пригодится, потому что в полном виде для pdf я это нигде не нашел.