4 Replies Latest reply on Aug 9, 2009 10:43 PM by BahaaHamza

    How to open a PDF File from a ByteArray

    Alexandre F Almeida

      Hi, Fellows,
       
      I'm having the following problem:
       
      I have put a PDF file inside a BLOB field in a table in my SQLite database.
       
      And I can retrieve it from this database without any problem, receiving a ByteArray data type as result.
       
      What I want to know is what I should do to render this file in my HTML flex object without saving it to a file…
       
      I used the mx.controls.HTML.data property, but what I see is the TEXT of my PDF file. The mx.controls.HTML.location needs a STRING with the link to a URL site or file.
       
      Thanks in advance for your help.
       
      Here, my code:
       
      <?xml version="1.0" encoding="utf-8"?>
      <mx:WindowedApplication xmlns:mx=" http://www.adobe.com/2006/mxml" layout="absolute" width="810" height="620"
            creationComplete="creationCompleteHandler();">
            <mx:Script>
                  <![CDATA[
                        import flash.data.*;
                        import flash.filesystem.*;
       
                         private var _connection:SQLConnection;
                        private var _statement:SQLStatement; 
                         
                   private function creationCompleteHandler():void {
                      var file:File = File.applicationStorageDirectory.resolvePath("arq.db");
                      _connection = new SQLConnection();
                      _connection.addEventListener(SQLEvent.OPEN, openHandler);
                      _connection.openAsync(file, SQLMode.CREATE);
                  }
                  
                   private function openHandler(event:SQLEvent):void {
                      var sql:SQLStatement = new SQLStatement();
                      sql.sqlConnection = _connection;
                      sql.text = "CREATE TABLE IF NOT EXISTS arq(" +
                                 "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                                 "nome TEXT, " + 
                                  "arquivo BLOB)";
                      sql.execute();        
                   } 
                   
                   private function insertFile(identificacao:String, caminho:String):void {
                              var sql:SQLStatement = new SQLStatement();
                              sql.sqlConnection = _connection;
                              var arquivo:File = new File(caminho);
                              var arqStream:FileStream = new FileStream();
                              arqStream.open(arquivo,SQLMode.READ);
                              var arqBlob:ByteArray = new ByteArray();
                              arqStream.readBytes(arqBlob);
                              arqStream.close();
                      sql.text = "INSERT INTO arq(nome, arquivo)" + 
                                  "VALUES(@nome, @arquivo)";
                      sql.parameters["@nome"] = identificacao;
                      sql.parameters["@arquivo"] = arqBlob;
                      sql.execute();
                      
                       trace("Arquivo inserido com Sucesso!!!");
                      
                       lb1.text = "Arquivo inserido com Sucesso!!!";
                        
                   }   
                   
                   private function selectFile(identificacao:String):void {
                        
                               var sql:SQLStatement = new SQLStatement();
                              sql.sqlConnection = _connection;
                      sql.text = "SELECT id, arquivo FROM arq WHERE nome=@nome";
                      sql.parameters["@nome"] = identificacao;
                      trace(sql.text);
                      sql.addEventListener(SQLEvent.RESULT, apresentarDados);
                      sql.execute();
       
                   }
                  
                   private function apresentarDados(event:SQLEvent):void {
       
                               var statement:SQLStatement = event.target as SQLStatement;
                              var result:SQLResult = statement.getResult();
                              if(result != null && result.data != null) {
                                    var dataset:Array = result.data;
                                    trace(dataset.length);
                              var arqBlob:ByteArray = dataset[0].arquivo;
                      
                         var xx:HTMLLoader = new  HTMLLoader();
                        var ur:URLRequest = new URLRequest();
                        var ul:URLLoader = new URLLoader();
                        
                         //Right now, it's doing nothing
      ur.contentType = "application/pdf";
                        
                         ul.dataFormat = URLLoaderDataFormat.BINARY;
                        ul.data = arqBlob;
                                          
                         //Here is my problem - WHAT SHOULD I DO?
      pdfFile.data = arqBlob;
                  
                             trace("Cheguei!!!");
                            lb1.text = "Cheguei!!!";
                                    
                               } else {
                                    trace("Não funcionou!!!")
                              }
                        
                   }
                  
                   private function sair():void {
                        this.exit();
                  }
                        
                   ]]>
            </mx:Script>
            <mx:TextInput x="99" y="10" id="arq"/>
            <mx:Label x="10" y="12" text="Identificação:" width="81"/>
            <mx:Button x="168" y="40" label="Apresentar" click="selectFile(arq.text)"/>
            <mx:Button x="728" y="10" label="Sair" width="60" click="sair()"/>
            <mx:TextInput x="417" y="10" id="id1"/>
            <mx:TextInput x="417" y="40" id="cm1"/>
            <mx:Button x="585" y="12" label="Gravar" click="insertFile(id1.text, cm1.text)"/>
            <mx:Label x="291" y="12" text="Identificação:" width="105"/>
            <mx:Label x="291" y="42" text="Caminho Completo:" width="118"/>
            <mx:Label x="615" y="42" width="173" id="lb1"/>
            <mx:HTML id="pdfFile" width="800" height="520" y="79"/>
       
      </mx:WindowedApplication>