Pdf.js: 刷新页面后记住视图位置

创建于 2016-01-08  ·  34评论  ·  资料来源: mozilla/pdf.js

当前,视图位置是基于文件内容的哈希值保存的。 重新加载页面时,我们还应考虑最后一个位置,因为它与浏览器的正常行为相匹配。 通常,当您重新加载网页时,滚动偏移量将恢复(即使页面内容已更改)。

进行此更改的动机来自经历以下中断的工作流程:

  1. 生成本地PDF文件( file://....pdf )。
  2. 使用PDF.js打开PDF并滚动到PDF文件中的某些章节。
  3. 编辑PDF文件。
  4. 刷新PDF.js查看器(例如,使用F5)。
  5. 预期结果:保持滚动位置。
    实际结果:第1页显示在视口中。

技术说明:

  • performance.navigation.type可用于检测页面重载与导航。
  • 重新加载页面时,将保留history.state
1-viewer

所有34条评论

那将是真棒。

我是塞内卡大学学习开放源代码的学生,我希望在我的课程中解决这个错误。 如果目前没有人在研究它,我想尝试一下。

没有人表明他们正在为此工作,所以这全属于您了! 如有疑问,请随时通过IRC与我们联系或在此处留言。

嘿,非常感谢您的快速回复。 我真的很想为一个开源项目做贡献。 我将立即开始工作。 自从我第一次做这样的事情以来,有什么我应该知道的吗?
非常感谢!

我认为此补丁的所有必要信息都列在https://github.com/mozilla/pdf.js/wiki/Contributing中。 除非您要触摸src/文件夹中的文件(我不希望这样做;我希望您只需要触摸web/文件夹中的文件),否则只需要运行gulp lintgulp unittest来验证您的更改。 您可以运行gulp server启动本地服务器以测试浏览器中的更改。 如果您还有其他问题,请查看Wiki,在IRC上与我们联系或在此处询问。 祝好运!

谢谢,我将开始阅读文件。

我正在调查这个问题,但是我不知道我是否很好地理解了这个问题。

1-生成本地PDF文件(file://....pdf)。
3-编辑PDF文件。

因此,问题仅与构建/生成自己的PDF有关吗? 例如,使用诸如latex / jspdf的pdf生成器来构建它?

我做了以下工作,无法重现:

  1. 构建自己的PDF并用http://localhost:8888/web/viewer.html?file=/andrei_test/a4.pdf打开
  2. 导航至第3页。
  3. 然后编辑pdf(在第3页中添加了更多文本)
  4. 刷新并看到出现在page3上的新内容,但我仍在第3页上,pdf.js并未将我移至第1页。

在此之前,我只是尝试从viewer.html刷新默认的PDF几次,但我的印象是根本不记得该页面。 但是现在我想我明白了,如果我刷新得太快(在完成内部哈希操作以记住刷新后在何处回滚之前),那么它将使我到达上一次滚动之前的最后一个位置,而不是我最后位置。 但是,如果我再等半秒钟然后刷新,那么我觉得很好,我可以将位置滚动到上次滚动的位置。

所以我不太确定我在这里要干什么。 您能否提供更多有关如何复制的细节? 谢谢!

我目前无法再次测试,但是在第4步中,您习惯了
刷新后跳至第1页(如果文档已更改)。 那说我不是
在本地但通过服务器连接工作。 不确定是否可以使
区别。

2017年12月31日,星期日,上午4:42,Andrei Petre [email protected]
写道:

我正在调查这个问题,但我不知道我是否非常了解这个问题
好。

1-生成本地PDF文件(file://....pdf)。
3-编辑PDF文件。

因此,问题仅与构建/生成自己的PDF有关吗? 例如
用诸如latex / jspdf的pdf生成器构建它?

我做了以下工作,无法重现:

  1. 构建自己的PDF并使用http:// localhost :8888 / web /打开
    viewer.html?file = / andrei_test / a4.pdf
    http:// localhost:8888 / web / viewer.html?file = / andrei_test / a4.pdf
  2. 导航至第3页。
  3. 然后编辑pdf(在第3页中添加了更多文本)
  4. 刷新并看到出现在page3上的新内容,但我仍然
    在第3页上,pdf.js并未将我移至第1页。

在此之前,我只是尝试从viewer.html中刷新默认的PDF
几次,我的印象是该页面没有被记住
所有。 但是现在我想我明白了,如果我刷新得太快(在
内部哈希处理是为了记住刷新后向后滚动的位置),
那么它将使我进入上次滚动之前的最后一次,而不是
到我的最后位置。 但是如果我再半秒钟再刷新,
然后我觉得很好,我将位置滚动到上次滚动的位置。

所以我不太确定我在这里要干什么。 您能否提供更多细节
到如何繁殖? 谢谢!

-
您收到此邮件是因为您发表了评论。
直接回复此电子邮件,在GitHub上查看
https://github.com/mozilla/pdf.js/issues/6847#issuecomment-354573873
或使线程静音
https://github.com/notifications/unsubscribe-auth/AGBkZqzS34MYDM8wZi41cNY0NiVUyoI-ks5tFsNqgaJpZM4HBeqE

我刚刚进行了重新测试,因此在重新加载时肯定回到了第一页。 这个
与chrome浏览器配合使用(如果有帮助)。 仍在工作
使用http服务器远程进行。
顺便说一下,sharelatex,rstudio和其他人正在使用pdf.js后端和
显然已经解决了这个问题。 我们可以不只是要求他们
贡献补丁?

在2017年12月31日星期日,上午7:18,Yasha Savelyev [email protected]
写道:

我目前无法再次测试,但是在第4步中,您习惯了
刷新后跳至第1页(如果文档已更改)。 那说我不是
在本地但通过服务器连接工作。 不确定是否可以使
区别。

2017年12月31日,星期日,上午4:42,Andrei Petre [email protected]
写道:

我正在调查这个问题,但我不知道我是否非常了解这个问题
好。

1-生成本地PDF文件(file://....pdf)。
3-编辑PDF文件。

因此,问题仅与构建/生成自己的PDF有关吗? 例如
用诸如latex / jspdf的pdf生成器构建它?

我做了以下工作,无法重现:

  1. 建立自己的PDF并使用
    http:// localhost :8888 / web / viewer.html?file = / andrei_test / a4.pdf
    http:// localhost:8888 / web / viewer.html?file = / andrei_test / a4.pdf
  2. 导航至第3页。
  3. 然后编辑pdf(在第3页中添加了更多文本)
  4. 刷新并看到出现在page3上的新内容,但我仍然
    在第3页上,pdf.js并未将我移至第1页。

在此之前,我只是尝试从viewer.html中刷新默认的PDF
几次,我的印象是该页面没有被记住
所有。 但是现在我想我明白了,如果我刷新得太快(在
内部哈希处理是为了记住刷新后向后滚动的位置),
那么它将使我进入上次滚动之前的最后一次,而不是
到我的最后位置。 但是如果我再半秒钟再刷新,
然后我觉得很好,我将位置滚动到上次滚动的位置。

所以我不太确定我在这里要干什么。 您能否提供更多细节
到如何繁殖? 谢谢!

-
您收到此邮件是因为您发表了评论。
直接回复此电子邮件,在GitHub上查看
https://github.com/mozilla/pdf.js/issues/6847#issuecomment-354573873
或使线程静音
https://github.com/notifications/unsubscribe-auth/AGBkZqzS34MYDM8wZi41cNY0NiVUyoI-ks5tFsNqgaJpZM4HBeqE

我可以确认此问题是可重现的。 不仅页面移回,缩放也被重置。 我怀疑这可能是由于修改文件时哈希值发生了变化。

@timvandermeij这是

我不知道

BrianNgo:我可以确认这个问题是可以重现的。 不仅页面移回,缩放也被重置。 我怀疑这可能是由于修改文件时哈希值发生了变化。

@BrianNgo您是否在本地使用代码进行工作,或者如何进行测试? 您能否提供一些分步的复制信息?

yashamon:仍在与HTTP服务器远程协作

@yashamon您能否解释更多设置? 这可能取决于此,因为当我尝试运行本地服务器并在localhost(例如http://localhost:8888/web/viewer.html?file=/andrei_test/a4.pdf )访问它时,我无法重现此内容。 我也在用铬。

Jolo510: @timvandermeij这是争夺

@ Jolo510可以争夺了,去争取。 我没有在处理它,我上次尝试无法复制它。

这里的问题是文件仅稍有更改,但哈希值已完全更改。 出于测试目的,实际的PDF内容并不重要,您只需要确保要测试的PDF具有不同的哈希即可。

为了更可靠地重现,您可以获取一组完全不相关的PDF文件(例如test/pdfs/的PDF),并在重新加载PDF.js之前覆盖PDF文件(视图设置为第2页,以便您将看到第1页和第2页之间的区别)。 这样,相同的文件路径将指向不同的文件,您可以看到实际的错误。

@andreip是的,我正在使用Chrome在本地进行测试。 我所做的是打开与您的PDF相似的pdf文件: http:// localhost :8888 / web / viewer.html?file = / andrei_test / a4.pdf。 然后,我使用libreoffice修改了文件并导出了文件。 刷新页面,然后发生错误。

我认为这并不是一个错误。 通过修改文件,应用程序会将当前文件视为新文件(这是最安全的做法)。 因此,应用程序应重置其历史记录以将其视为新文件。

真正的问题是在完成内部哈希处理之前,刷新文件的速度过快。

@andreip太棒了! 我将查看是否在本地回购它。

我计划今晚让该应用在本地运行。 然后在第二天或第二天花一些时间重现该错误并挖掘代码。

@BrianNgo如果问题是刷新文件的速度过快,那么可能的解决方法是什么?

有什么进展吗?

2018年1月17日,星期三,23:07约翰尼·卢(Johnnie Lo), notifications@ github.com写道:

我计划今晚让该应用在本地运行。 然后花些时间
第二天或第二天重现该错误并挖掘代码。

@BrianNgo https://github.com/brianngo如果问题也令人耳目一新
很快,有什么可能的解决方法?

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/mozilla/pdf.js/issues/6847#issuecomment-358539017
或使线程静音
https://github.com/notifications/unsubscribe-auth/AGBkZmlmOIxzNatXTXTGW3bNaeNFkWFzks5tLtF2gaJpZM4HBeqE

@yashamon不,我在这方面没有取得任何进展。

@ Rob--W
嘿,
我看到很多人对此进行了射击。 试试看。 请让我知道我们是否也需要为此编写测试

@ ankitverma2211如果可能的话,测试会很棒。
但是,我们没有针对此类功能的自动测试,因此,如果补丁看起来合理并通过了手动测试,那么我们也将接受它。

我想从这里开始。 目前有其他人在为此工作吗?

从来没听说过。 随时进行这项工作!

我一定会在IRC上向你们发送任何帮助

于2018年12月24日星期一下午4:24 Tim van der Meij [email protected]
写道:

从来没听说过。 随时进行这项工作!

-
您收到此邮件是因为您发表了评论。
直接回复此电子邮件,在GitHub上查看
https://github.com/mozilla/pdf.js/issues/6847#issuecomment-449718751
或使线程静音
https://github.com/notifications/unsubscribe-auth/AF8SZdbnLGoX5cY1fvk02tcM_3o8KDctks5u8LJUgaJpZM4HBeqE

@timvandermeij我遍历了呈现pdf文件时涉及的整个代码。
它使用本地存储来存储带有文件作为数组的pdfjs视图历史记录。 每个元素都在其中存储文件的指纹以及有关最后视图历史记录的其他元数据。 当我们修改文件指纹时,文件更改也没有,对于该新指纹,我们没有任何查看历史记录。

我的旧文件指纹=> 14ecd8cdbbf6f76f04030d59025b5937

文件更改后的指纹=> 619c4c4f872e96e6514b25c6a1ae03f2

就我对文档进行指纹计算而言,它取决于内容和pdf预告片。

这是一些参考

Figerprint计算

stackoverflow参考

让我知道你对此有何评论。 我们应该解决这个问题吗?

嗨Rahul,

如果您查看实际使用Sharelatex(使用pdf.js作为
后端,并且已经解决,在乳胶源之后重新呈现pdf
代码更改,这肯定会更改任何哈希,同时保留视图
位置。 我相信他们的扩展名是github上的开源代码,但不要
准备好链接。

2018年12月28日星期五,下午3:01 Rahul Sharma [email protected]
写道:

@timvandermeij https://github.com/timvandermeij我已经经历了
呈现pdf文件时涉及的整个代码。
它使用本地存储来将文件作为
数组。 每个元素都在其中存储文件的指纹
有关上次观看记录的元数据。 当我们修改文件指纹时
文件更改,对于该新指纹,我们没有任何视图
历史。

我的旧文件指纹=> 14ecd8cdbbf6f76f04030d59025b5937

文件更改后的指纹=> 619c4c4f872e96e6514b25c6a1ae03f2

就我为文档进行指纹计算而言,这取决于
在内容和pdf预告片上。

这是一些参考

Figerprint计算
https://github.com/mozilla/pdf.js/blob/58c3ea08202becf007c304512c44726719acb508/src/core/core.js#L513

stackoverflow参考
https://stackoverflow.com/questions/33309378/using-fingerprint-generation-by-pdfjs-as-unique-id-for-a-pdf

让我知道你对此有何评论。 我们应该解决这个问题吗?

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/mozilla/pdf.js/issues/6847#issuecomment-450426605
或使线程静音
https://github.com/notifications/unsubscribe-auth/AGBkZidcCqtZjNp18mXaFfC78IfPRj-1ks5u9oaTgaJpZM4HBeqE

如果您可以共享对此负责的存储库链接,那么它将对此存储库有很大的帮助,而不是一个错误。

我曾经有过一个lublessmonkey脚本,它将“ Cr”键替换为“ viewBookmark”点击,这基本上为我解决了这个问题。 在某些版本的Firefox之后无法正常运行。 似乎pdf.js中未加载油脂猴子。 有意吗

编辑:经过一番搜索,我认为这是故意的-https: //discourse.mozilla.org/t/extensions-on-pdfjs-pages/28441

@timvandermeij @yashamon

我看过Sharelatex回购。 他们通过使用projectId而不是随文档更改而变化的指纹来跟踪pdfjs.history来执行此操作,但是该特定文档的projectId对于sharelatex保持不变。

我在想几个问题。 我试图在IRC中与你们联系,但没有得到回应

问题:

  1. 是我们需要在pdf更改并且用户在新选项卡中打开新文件时也保持页码吗?
    就像目前的指纹方法一样。
  2. 如果只需要在当前选项卡中,则可以使用会话,否则我们将在view_history中附加更多键。
    请指导我

已在#10424中修复。

刚刚测试了这个,还是一样的行为。 刷新页面仅在pdf文件不变的情况下修复页面视图的位置,否则视图跳至第一页。 这很容易用乳胶测试,选择一个文档进行编译并预览pdf,然后在乳胶源中添加一个随机单词,重新编译并预览pdf,pdfjs预览跳至第一页。 我的Chrome版本为2.2.191。 如果有机会,我将检查Firefox。

我使用firefox进行了测试,看起来在最新版本上该问题已得到解决,仅仅是Chrome版本落后了吗?

Chrome扩展程序版本包含此补丁。 由于浏览器行为的不同,其行为可能有所不同。 我曾经在https://github.com/mozilla/pdf.js/commit/cdea75dc397f4eb4d6fd1f7d8a388c7d11df3452 (这是https://github.com/mozilla/pdf.js/pull/6200的一部分)上发布了对该问题的详细描述。 。

我针对* latex生成的pdf提交了类似的问题#11359。 使用“基于文件内容的哈希” @ Rob--W实际上是不正确的。 相反,它是创建时嵌入在PDF中的ID,并且如何生成该ID取决于生成的应用程序,对于* latex,它是基于当前时间和tex文件路径名的组合的哈希。 有关解决方案,请参阅我的最新评论。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

AlexP3 picture AlexP3  ·  3评论

patelsumit5192 picture patelsumit5192  ·  3评论

THausherr picture THausherr  ·  3评论

brandonros picture brandonros  ·  3评论

anggikolo11 picture anggikolo11  ·  3评论