#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.