I took the following piece of code from github
function smartReadFile($location, $filename, $mimeType = 'application/pdf')
{
  if (!file_exists($location))
  {
     header ("HTTP/1.1 404 Not Found");
     return;
  }
  $size = filesize($location);
  $time = date('r', filemtime($location));
  $fm       = @fopen($location, 'rb');
  if (!$fm)
  {
     header ("HTTP/1.1 505 Internal server error");
     return;
  }
  $begin    = 0;
  $end  = $size - 1;
  if (isset($_SERVER['HTTP_RANGE']))
  {
     if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
     {
        $begin  = intval($matches[1]);
        if (!empty($matches[2]))
        {
            $end    = intval($matches[2]);
        }
     }
  }
    if (isset($_SERVER['HTTP_RANGE']))
    {
       header('HTTP/1.1 206 Partial Content');
    }
    else
    {
       header('HTTP/1.1 200 OK');
    }
    header("Content-Type: $mimeType"); 
    header('Cache-Control: public, must-revalidate, max-age=0');
    header('Pragma: no-cache');  
    header('Accept-Ranges: bytes');
    header('Content-Length:' . (($end - $begin) + 1));
    if (isset($_SERVER['HTTP_RANGE']))
    {
       header("Content-Range: bytes $begin-$end/$size");
    }
    header("Content-Disposition: inline; filename=$filename");
    header("Content-Transfer-Encoding: binary");
    header("Last-Modified: $time");
    $cur    = $begin;
    fseek($fm, $begin, 0);
    while(!feof($fm) && $cur <= $end && (connection_status() == 0))
    {
      print fread($fm, min(1024 * 16, ($end - $cur) + 1));
      $cur += 1024 * 16;
    }
}
It is working for smaller files. But in case of large files it isn't working properly. I tried with a 100MB file. The PDF is partially loaded that too with a black background. I don't know what's wrong in the code. I suspect I had to modify the headers, but I don't know what to add/replace. I have tried many alternatives given in many sites, but none of them worked.
Thank you for any help
