Я работаю над проектом для термопринтера, где я использую Служба печати Android для печати счета из стороннего приложения. Поскольку я должен печатать как необработанный текст, мне нужно извлечь его из PrintJob , используя iTextPdf .
Все было хорошо до сих пор, когда я увидел ошибки ( stacktrace ниже ) в Crashlytics на некоторых устройствах. У них есть проблема один раз за ~ 15 сеансов печати. Даже не уверен, как я могу повторить эту ошибку или почему происходит не каждый раз.
Caused by java.io.IOException: read failed: EBADF (Bad file number)
at libcore.io.IoBridge.read + 435(IoBridge.java:435)
at java.io.FileInputStream.read + 179(FileInputStream.java:179)
at java.io.InputStream.read + 162(InputStream.java:162)
at com.itextpdf.text.io.StreamUtil.inputStreamToArray(StreamUtil.java)
at com.itextpdf.text.io.RandomAccessSourceFactory.createSource(RandomAccessSourceFactory.java)
at com.itextpdf.text.pdf.PdfReader.(Unknown Source)
at com.itextpdf.text.pdf.PdfReader.(Unknown Source)
at sk.blockomat.vrp.pdf.PdfHelper$Companion.extractText(PdfHelper.java)
at sk.blockomat.vrp.services.CustomPrinterService.extractPrintJobText(CustomPrinterService.java)
at sk.blockomat.vrp.services.CustomPrinterService.onPrintJobQueued(CustomPrinterService.java)
at android.printservice.PrintService$ServiceHandler.handleMessage + 516(PrintService.java:516)
at android.os.Handler.dispatchMessage + 102(Handler.java:102)
at android.os.Looper.loop + 136(Looper.java:136)
at android.app.ActivityThread.main + 5584(ActivityThread.java:5584)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke + 515(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run + 1268(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main + 1084(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(NativeStart.java)
Это код, который я использую для извлечения текста для PrintJob:
override fun onPrintJobQueued(job: PrintJob) {
//mark job as started
job.start()
//transform print job to text
var text = extractPrintJobText(job)
//print text
...
}
private fun extractPrintJobText(job: PrintJob): String {
val descriptor = job.document.data!!.fileDescriptor
//this stream look some way corrupted
val stream = FileInputStream(descriptor)
if(!stream.fd.valid()) {
//I never saw this warning, so I expect every stream is valid
logger.logWarning(TAG, "Stream fd is not valid!")
}
return extractText(stream)
}
Это часть приложения, где я получаю сообщение об ошибке.
fun extractText(stream: InputStream): String {
//line where I somethimes get EBADF (bad file number) error
val pdfReader = PdfReader(stream)
return extractText(pdfReader)
}
private fun extractText(pdfReader: PdfReader): String {
val pages = pdfReader.numberOfPages
var parsedText = ""
try {
for (i in 0 until pages) {
//Extracting the content from the different pages
parsedText += PdfTextExtractor.getTextFromPage(pdfReader, i + 1).trim() + "\n"
}
return parsedText
} finally {
pdfReader.close()
}
}