如何在已加载到 PDFView 的 PDF 上实现文本到语音

Posted

技术标签:

【中文标题】如何在已加载到 PDFView 的 PDF 上实现文本到语音【英文标题】:How do I implement text to speech on a PDF that's already loaded to PDFView 【发布时间】:2018-08-20 14:28:32 【问题描述】:

我正在尝试在我的应用程序中实现文本转语音。首先,我实现了 PDFview,它允许我从我的设备中选择 PDF 文件并加载它。我想要实现的是,在将此 PDF 加载到 PDFview 后,我想将文本读出来。我如何实现这一目标?

使用传入我的 PDFView 库的相同 Uri 来加载 pdf,以便我可以查看它

public String getRealPathFromURI(Context context, Uri contentURI)
    
        String result;

        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        if(cursor == null)
        
            result = contentURI.getPath();
         else 

            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA);
            result = cursor.getString(idx);
            cursor.close();
        
        return result;









 btnSpeak.setOnClickListener(new View.OnClickListener() 
           @Override
           public void onClick(View view) 
                    String parsedText = "";
               try
               

                    PdfReader pdfReader = new  PdfReader(getRealPathFromURI(getContext(), uri));
                   int n = pdfReader.getNumberOfPages();
                  for (int i = 0; i < n; i++) 
                       parsedText = parsedText + PdfTextExtractor.getTextFromPage(pdfReader, i + 1).trim() + "\n";
                   
                   pdfReader.close();


                   textToSpeech.speak(parsedText, TextToSpeech.QUEUE_FLUSH, null);
               
               catch (Exception ex)
               

               
           
       );

上面的代码是我试图做的。

【问题讨论】:

你会 1) 创建一个 TextToSpeech 对象,tts,2) 将 pdf 文件中的所有 txt 从头到尾解析成一个长字符串,以及 3) tts.speak(string)。如果这是您想要做的更具体的事情,那么可以用更精确的要求编辑问题。 我试图将 PDF 中的所有文本解析为一个长字符串。我尝试使用 IText PDFReader 库来做到这一点,但它不起作用,因此 tts 无法读出文本 您可以使用 Log 和 logcat 来确定您是否遇到异常,如果是,是什么。如果您没有收到异常,请通过记录它来检查您是否实际上在 parseText 字符串中获取了任何文本。如果你得到正确的文本,那么问题出在 textToSpeech (可疑)。 实际上我没有从 parsedText 中得到任何文本。我认为这就是问题所在。我尝试了正常的文本,并且 tts 工作正常。它从 PDF 中提取文本有点问题 我真的没有使用 URI 或 PDFReader 类的经验...但是如果您在代码的不同位置应用使用 Log.i(...) 的相同方法来验证事情正在按照你所期望的方式发生,那么你就会发现问题所在。例如,您可以记录 getRealPath() 给出的结果以确保它是正确的......或者您可以在 for 循环中记录以确保它甚至被执行。 【参考方案1】:

试试这个:

btnSpeak.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                String parsedText = "We did not get any text from the PDF.  You will have to examine why.";
                try 
                    PdfReader pdfReader = new PdfReader(getRealPathFromURI(getContext(), uri));
                    int n = pdfReader.getNumberOfPages();
                    for (int i = 0; i < n; i++) 
                        parsedText = parsedText + PdfTextExtractor.getTextFromPage(pdfReader, i + 1).trim() + "\n";
                    
                    pdfReader.close();
                     
                    catch (Exception ex) 
                    
                    Log.i("XXX", "There was an exception: " + ex);    
                    
                textToSpeech.speak(parsedText, TextToSpeech.QUEUE_FLUSH, null);
            
        );

【讨论】:

以上是关于如何在已加载到 PDFView 的 PDF 上实现文本到语音的主要内容,如果未能解决你的问题,请参考以下文章

安卓加载展示PDF文件(腾讯X5内核(TbsReaderView)+PDFView)

安卓加载展示PDF文件(腾讯X5内核(TbsReaderView)+PDFView)

如何在 swift 中将 UIImage 中的 PDF 放入 PDFView 中?

Cocoa PDFView 仅在调整大小时显示 PDF

java做 pdf转换成图片 时出现Unknown CMap: UniGB-UCS2-H?急~

PDF查看:Android 用PDFView实现PDF查看器