Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Captura de caminho de arquivo Selecionado

Tenho uma rotina de leitura de arquivos que, através de uma RegEx , ele captura um conteúdo "X" do arquivo, conforme exemplo abaixo:

public void stripText(View v) {
      String parsedText = null;
      PDDocument document = null;
      try {
         document = PDDocument.load(assetManager.open("NUBank.pdf"));
      } catch(IOException e) {
         e.printStackTrace();
      }
      try {
         PDFTextStripper pdfStripper = new PDFTextStripper();
         pdfStripper.setStartPage(0);
         pdfStripper.setEndPage(1);
         parsedText = "Parsed text: " + pdfStripper.getText(document);
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         try {
            if (document != null) document.close();
         } catch (Exception e) {
            e.printStackTrace();
         }
      }
        Log.i("Texto do PDF: ", parsedText);
}

Nesse trecho, o arquivo "NUbank.pdf" está na pasta "Assets" do projeto, e o pdf é normalmente lido e parseado.

O que preciso agora é que o usuário , ao selecionar o arquivo no celular, ele busque o caminho do arquivo e o coloque na rotina "PPDocument.load". Tentei o caminho abaixo, dentre outros, sem sucesso:

public class MainActivity extends Activity {
    File root;
    AssetManager assetManager;
    Bitmap pageImage;
    TextView tv;

    private static final int ARQUIVOBOLETO = 123;
    String caminhoPdf;
        File arquivoPdf;

Button btnSelArq = (Button) findViewById(R.id.btnAbrir);
        btnSelArq.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent chamaStore = new Intent((Intent.ACTION_OPEN_DOCUMENT));
                chamaStore.setType("application/pdf");
                startActivityForResult(Intent.createChooser(chamaStore,"Selecione Arquivo"),ARQUIVOBOLETO);

            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == ARQUIVOBOLETO){
            if (resultCode == Activity.RESULT_OK){
                Uri pdfSelecionado = data.getData();


                caminhoPdf = pdfSelecionado.toString();
                System.out.println("Caminho: " + caminhoPdf);

                String parsedText = null;
                PDDocument document = null;
                try {
                    document = PDDocument.load(assetManager.open(caminhoPdf));
                } catch(IOException e) {
                    e.printStackTrace();
                }

                try {
                    PDFTextStripper pdfStripper = new PDFTextStripper();
                    pdfStripper.setStartPage(0);
                    pdfStripper.setEndPage(1);
                    parsedText = "Parsed text: " + pdfStripper.getText(document);
                } catch (Exception e) {
                    e.printStackTrace();

Nessa situação, ele retornou o erro:

Caused by: java.lang.NullPointerException: println needs a message
        at android.util.Log.println_native(Native Method)
        at android.util.Log.i(Log.java:198)
        at com.tom_roush.pdfbox.sample.MainActivity.onActivityResult(MainActivity.java:116)

Então, como posso colocar o arquivo selecionado pelo usuário dentro dessa rotina?

Obs: O PDDocument.load aceita duas entradas:

PDDocument.load(Nome do Arquivo); PDDocument.load(assetManager.open(caminhDoArquivoEmString))

Obrigado desde já

1 resposta
solução!

Oi Flávio, tudo bem? Bom, não sei que versão do Android você está usando, mas a partir da versão 6 se não me engano, o Android começou a trabalhar com Providers e Uris para localizar arquivos, etc.

O PDF direto dentro da pasta Asset funciona por que o você está apenas acessando algo que a aplicação já pode acessar (dentro do mesmo escopo).

Se você tentar acessar outra coisa fora, pode ter problemas.

O getData por exemplo, não vai te retornar mais o path do arquivo como o PDDocument espera. Ele vai te retornar uma Uri iniciando com algo como "content://..."

Nesse caso, o que pode ajudar é converter o Uri para um Path. Como fazer isso?

Uri.parse(data.getData()).getPath();

Isso deve ajudar.