Как я могу создать pdf с помощью хранилища Доступ к хранилищу в Android Studio с помощью kotlin?

#android #android-studio #kotlin #itext7

Вопрос:

Я начинающий программист Android/Kotlin. Я занимаюсь проектом по созданию pdf в Android. Я пытался создавать простые pdf-документы с помощью itextpdf:itext7 во внутреннем расположении приложения, но это не позволяет пользователю просматривать файлы. Поэтому мне приходится создавать, используя платформу доступа к хранилищу. Я создавал текстовые файлы с помощью SAF, но файлы pdf кажутся мне тупиковыми

Я искал доступные ресурсы, но не смог получить никаких материалов/или ресурсов по этому вопросу. Мои попытки попробовать это тоже не увенчались успехом. Приложение просто рухнуло/закрылось.

Кто-нибудь может показать мне, как это делается правильно?

Спасибо.

 class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    var saveHandle = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
        resultData: ActivityResult ->
        val uri = resultData.data?.data
        if (resultData.resultCode == Activity.RESULT_OK){
            if (uri != null){
                WritetoPdf(uri)
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView(R.layout.activity_main)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.btnCreate.setOnClickListener {
            //CreatePdf()
            val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
                type = "text/.pdf"
                addCategory(Intent.CATEGORY_OPENABLE)
            }
            saveHandle.launch(intent)
        }
    }

    fun WritetoPdf(uri: Uri) {
        var writeStream: ParcelFileDescriptor? = contentResolver.openFileDescriptor(uri, "w")
        var pdfFile = File(uri.toString())
        val pdf = PdfDocument(PdfWriter(pdfFile.toString()))
        val document = Document(pdf)
        val line = "Hello! Welcome to iTextPdf"
        document.add(Paragraph(line))
        document.close()
    }
}
 

Комментарии:

1. My attempts to give it a try also failed. The app simply crashed/closed down. у вас есть опыт работы на этом сайте, вы должны знать, что это не сработает, опубликуйте то, что вы пробовали, а что не работает

Ответ №1:

Заменять:

     var writeStream: ParcelFileDescriptor? = contentResolver.openFileDescriptor(uri, "w")
    var pdfFile = File(uri.toString())
    val pdf = PdfDocument(PdfWriter(pdfFile.toString()))
 

с:

     var writeStream = contentResolver.openOutputStream(uri, "w")
    val pdf = PdfDocument(PdfWriter(writeStream))
 

Или запишите PDF File -файл в файл, который вы контролируете, а затем скопируйте содержимое File в место, выбранное пользователем, с помощью SAF.