首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从pdf.js断续的“无效或损坏的PDF文件”

从pdf.js断续的“无效或损坏的PDF文件”
EN

Stack Overflow用户
提问于 2021-12-03 21:18:57
回答 1查看 273关注 0票数 0

我正在建立一个私人网站,与我的亲戚分享一些古老的家书。为了防止字母被爬行,我使用一个名为smartReadFile的函数(如下图所示)将字母流到浏览器。(我会给这个家庭一个进入网站的密码。)字母是PDF,是用扫描仪创建的。

我发现有些字母总是显示得很好,有些则是断断续续地显示,而有些则根本不显示。所有这些都与Acrobat阅读器打开得很好。当一个字母显示失败时,我在(Firefox的)控制台中看到这条消息:

代码语言:javascript
复制
Invalid or corrupted PDF file.
PDF.js v2.11.298 (build: d370a281c)
Message: Invalid PDF structure.

我已经用Firefox (94.0.2)和Chrome (96.0.4664.45)进行了测试,而在任何给定的时间,给定的字母在其中一个或另一个中的行为可能有所不同,但在这两个方面我似乎都有相同的基本问题。(刚和Edge一起做了测试。同样的问题。)

目前,这都是我的开发机器的本地特性,运行Windows 10 v.21H1。安装的web服务器是IIS。

这是我没有写的函数。(是从我儿子那里得到的,他原来是从别人那里得到的。)

代码语言:javascript
复制
function smartReadFile($location, $filename, $mimeType = 'application/octet-stream')
{
    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");
    }
    if($_REQUEST['SaveAs'] == "1"){
        header('Content-Disposition: attachment; filename=' . $filename);  
    }else{
        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;
    }
}

我的直觉是,这是关于文件大小或超时或类似的东西,但我不知道如何修复它。我试着缩小我正在阅读和传递的块的大小(通过将函数末尾的乘法器从16变到4或2),但没有运气。

EN

回答 1

Stack Overflow用户

发布于 2021-12-06 20:02:46

在我儿子的建议下,我在一个生产web服务器上尝试了一个简化版本(而不是我的本地安装),问题就消失了。因此,我将把它归结为IIS安装中的一些设置,这些设置我不需要弄清楚,然后继续完成这个项目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70220790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档