有没有办法设置 Google Chrome 默认 PDF 查看器的样式

新手上路,请多包涵

有没有办法设置谷歌浏览器默认 pdf 视图的样式?我正在尝试将灰色背景颜色更改为白色,如果可能的话,也使移动设备的滚动条更大一些。

我试图在没有运气的情况下将其定位在 CSS 上

// pdf viewer custom style
iframe {
    html {
        body {
            background-color: #ffffff !important;
        }
        #zoom-toolbar {
            display: none !important;
        }
        #zoom-buttons {
            display: none !important;
        }
    }
}

看起来它正在 html 上创建影子文档,但我找不到任何方法来定位它

原文由 Tan Kucukhas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

无法直接设置 Chrome 默认 PDF 查看器 (PDFium) 的样式。因为插件显示和控制的内容超出了当前页面的 DOM 范围,所以只能由插件修改。如此处 所示,除非插件还添加了允许页面将消息传递给插件的内容脚本,否则无法对此类插件控制的内容进行修改;插件必须另外编程以响应消息并适当地更新内容。换句话说,PDF 查看器使用一个单独的 DOM 来访问不可直接访问的页面。相反,您需要访问已实现的 API。

本次 讨论中,Mike West(Google/Chromium 开发人员)在回答有关 Chrome 的 PDF 查看器中 DOM 可访问性的问题时表示:

PDF 查看器中可用的功能(故意)相当有限……您找不到的 API 根本不存在。

基本 API 函数是 Adobe 在其 打开 PDF 文件的参数中 指定的一些函数,可通过 URL 访问(例如 http://example.org/doc.pdf#page=3&pagemode=thumbs 。如上所述,它们非常有限,允许用户直接访问如果您知道可用的 JavaScript 消息,则可以通过内容脚本消息访问扩展的 API。可用 JS 消息名称的完整列表可以从相关的 PDFium 源中确定可以看出,查看器的高级样式,例如改变颜色,是不可能的。( 这个 问题给出了一个如何实现API的例子)。当然没有访问PDFium的DOM。

此 API 故意未记录在案;它可能随时随着添加或删除而改变。因此,虽然将来可能会有一个 API 让您对查看器的某些方面进行样式设置,但不太可能会更改背景颜色或修改 CSS 阴影。而且,如上所述,如果没有 API,当您无权访问其 DOM 时,您无法修改由插件控制的内容。


相反,您可能希望尝试 PDF.js。 它是一个开源 JavaScript 库,使用 HTML5 Canvas 呈现 PDF 文件。它也是 Firefox 的默认 PDF 查看器,功能强大。

将其实现为 Web 应用程序超出了此问题的范围,但有许多有用的教程可用。而且,作为开发人员,您将有权访问所有组成文件,您当然可以随意设置 PDF.js 查看器的样式。

原文由 jla 发布,翻译遵循 CC BY-SA 4.0 许可协议

更新: Chrome 的最新版本似乎已将 PDF 查看器资源从 resources.pak 移至浏览器二进制文件本身。应该仍然可以下载 Chromium 源,编辑下面描述的文件,然后重新编译,但这比简单地破解 resources.pak 更痛苦。谢谢,谷歌。

事实上,有一种方法,但我们必须亲自动手,而且每次更新 Chrome 时都必须重复这个过程。不过,对我来说,努力是值得的。我喜欢将 PDF 查看器的背景更改为白色,这样当我在晚上激活颜色反转 Deluminate 扩展时,我会得到一个漂亮的纯黑色背景。与默认背景相比,它对我的眼睛来说要容易得多,当倒置时,它会非常明亮。

Chrome 源代码树包含数千个 HTML、JS 和 CSS 文件,这些文件控制浏览器许多部分的行为和外观,包括 PDF 查看器。构建 Chrome 时,这些“资源”被捆绑到一个文件中,即 resources.pak ,浏览器在启动期间将其解压缩到内存中。我们需要做的是在磁盘上解压 resources.pak ,编辑PDF查看器样式的文件,然后重新打包。

我们首先需要一个可以解压的工具 resources.pak 。我知道的唯一一个是 ChromePAK-V5 。它是用 Go 编写的,所以我们需要它来构建它。我们还需要安装一个名为 go-bindata 的构建时依赖项。这是我的做法:

 cd ~/code/chrome
go get -u github.com/jteeuwen/go-bindata/...
git clone https://github.com/shuax/ChromePAK-V5.git
cd ChromePAK-V5
~/go/bin/go-bindata -nomemcopy -o assets.go assets
go build
cd ..

现在我们已经有了二进制文件 ChromePAK-V5/ChromePAK-V5 ,我们可以用它来解压 resources.pak 。就我而言,在 Linux 上运行 Chromium,该文件位于 /usr/lib/chromium/resources.pak ,但它可能在其他地方适合您。找到后,将其复制、备份并解压缩:

 cd ~/code/chrome
cp /usr/lib/chromium/resources.pak .
cp resources.pak resources.pak.bak
ChromePAK-V5/ChromePAK-V5 -c=unpack -f=resources.pak

此时,我们需要的文件将位于 resources 目录中的某处。现在,在原始 Chrome 源代码树中,这些文件都有合理的路径,例如 chrome/browser/resources/pdf/pdf_viewer.js 。不幸的是,这些原始路径没有记录在 resources.pak 文件中。 ChromePAK-V5 尝试通过使用将资源文件的 SHA1 哈希映射到其原始路径的表来变得聪明,但随着时间的推移,文件及其哈希会发生变化,并且 ChromePAK-V5 不能不再认得他们。如果文件无法识别, ChromePAK-V5 会将其解压到,例如 resources/unknown/12345 。而且,一般来说,这些数字会从一个 Chrome 版本更改为下一个版本。因此,要找到我们需要编辑的文件,我们基本上需要用 grep 查找识别它们的“指纹”。让我们开始吧。

PDF 查看器的背景颜色由在 Chrome 源代码树中名为 chrome/browser/resources/pdf/pdf_viewer.js 的文件控制。要查找该文件,请在 resources/unknown 中使用 grep 搜索字符串 PDFViewer.BACKGROUND_COLOR 。就我而言,该文件在 unknown/10282 解压缩。打开此文件,并更改设置 PDFViewer.BACKGROUND_COLOR 的行(在文件末尾/附近)。我将其更改为 0xFFFFFFFF ,即白色(在 Deluminate 下变为黑色)。

更进一步,我们还可以重新设置 PDF 查看器工具栏的样式。默认情况下,工具栏是暗的,因此在 Deluminate 下它会变得非常亮。为了解决这个问题,我们需要找到 chrome/browser/resources/pdf/elements/viewer-pdf-toolbar.html 。我在 unknown/10307 通过 grepping for shadow-elevation-2dp 找到了它。我所做的是去 #toolbar 块并添加 filter: invert(100%); 。瞧,晚上不再有令人眼花缭乱的工具栏。

最后,如果我们真的想一路走下去,我们可以摆脱加载PDF时出现的原始背景颜色的短暂“闪光”。这种颜色由 chrome/browser/resources/pdf/index.css 控制,我在 unknown/10304 通过 grepping 找到了 viewer-page-indicator { 。我将 --- 的 background-color 属性更改为 body white (即在 Deluminate 下为黑色)。

困难的部分现在结束了。最后一步是重新打包资源并覆盖系统 resources.pak

 ChromePAK-V5/ChromePAK-V5 -c=repack -f=resources.json
sudo cp resources.pak /usr/lib/chromium       # or wherever yours should go

现在重新启动浏览器并享受!

原文由 Matt Kramer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题