Pdf.js: Запомните позицию просмотра после обновления страницы

Созданный на 8 янв. 2016  ·  34Комментарии  ·  Источник: mozilla/pdf.js

В настоящее время позиция просмотра сохраняется с помощью хэша на основе содержимого файла. Когда страница перезагружается, мы также должны учитывать последнюю позицию, потому что она соответствует нормальному поведению браузеров. Обычно, когда вы перезагружаете веб-страницу, смещение прокрутки восстанавливается (даже если содержимое страницы изменилось).

Мотивация для этого изменения исходит из того, что вы столкнулись со следующим нарушением рабочего процесса:

  1. Создайте локальный файл PDF ( file://....pdf ).
  2. Откройте PDF-файл с помощью PDF.js и перейдите к какой-либо главе в 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 lint и gulp unittest для проверки изменений. Вы можете запустить gulp server чтобы запустить локальный сервер и проверить свои изменения в браузере. Если у вас есть дополнительные вопросы, загляните в вики, свяжитесь с нами по IRC или задайте здесь. Удачи!

Спасибо, начну читать файлы.

Я изучаю это, но не знаю, хорошо ли я понял проблему.

1 - Создайте локальный файл PDF (файл: //....pdf).
3 - Редактировать PDF-файл.

Итак, проблема связана только с созданием моего собственного PDF-файла? Например, создать его с помощью генератора PDF, такого как latex / jspdf?

Я сделал следующее и не смог воспроизвести:

  1. Создал себе PDF-файл и открыл его с помощью http://localhost:8888/web/viewer.html?file=/andrei_test/a4.pdf
  2. перешел на страницу 3.
  3. Затем отредактировал pdf (добавил больше текста на странице 3)
  4. обновился и увидел новый контент на странице 3, но я все еще был на странице 3, pdf.js не переместил меня на страницу 1.

Перед этим я просто несколько раз пытался обновить PDF-файл по умолчанию с viewer.html , и у меня создалось впечатление, что страница вообще не запомнилась. Но теперь я думаю, что понимаю, если я обновляю его слишком быстро (до того, как будет выполнено внутреннее хеширование, чтобы запомнить, где прокручивать назад после обновления), тогда он просто приведет меня к последнему месту, где я был до моего последнего свитка, а не к моему Последняя позиция. Но если я подожду еще полсекунды, а затем обновлюсь, тогда я вижу, что все в порядке, я прокручиваю позицию до того места, где я прокручивал последний раз.

Так что я не совсем уверен, что мне здесь нужно. Не могли бы вы подробнее рассказать о том, как воспроизводить? Благодаря!

В данный момент я не могу повторить тест, но на шаге 4 вы поняли, что
перейти на страницу 1 после обновления (если документ изменился). Тем не менее, я не был
работает локально, но через соединение с сервером. Не уверен, что это может
разница.

Вск, 31 декабря 2017 г., 4:42, Андрей Петре [email protected]
написал:

Я изучаю это, но не знаю, понял ли я проблему очень
хорошо.

1 - Создайте локальный файл PDF (файл: //....pdf).
3 - Редактировать PDF-файл.

Итак, проблема связана только с созданием моего собственного PDF-файла? Например
создать его с помощью генератора PDF, такого как latex / jspdf?

Я сделал следующее и не смог воспроизвести:

  1. Создал себе PDF-файл и открыл его с http: // localhost : 8888 / web /
    viewer.html? file = / andrei_test / a4.pdf
    http: // локальный: 8888 / web / viewer.html? file = / andrei_test / a4.pdf
  2. перешел на страницу 3.
  3. Затем отредактировал pdf (добавил больше текста на странице 3)
  4. обновился и увидел новый контент на странице 3, но я все еще
    на странице 3 pdf.js не перемещал меня на страницу 1.

Перед этим я просто попытался обновить PDF-файл по умолчанию из viewer.html a
несколько раз, и у меня создалось впечатление, что страницу не запомнили в
все. Но теперь я думаю, что понимаю, если я обновляю его слишком быстро (до
внутреннее хеширование выполняется для запоминания места для прокрутки назад после обновления),
тогда это просто приведет меня к тому, когда я был в последний раз перед моим последним свитком, а не
на мою последнюю позицию. Но если бы я потратил еще полсекунды, а затем обновился,
тогда я вижу, что все в порядке, я получаю прокручиваемую позицию до места последней прокрутки.

Так что я не совсем уверен, что мне здесь нужно. Не могли бы вы подробнее рассказать
как воспроизвести? Благодаря!

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на 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 и
решили этот вопрос уже видимо. Не могли бы мы просто попросить их
внести патч?

Вск , 31 декабря 2017 г., 7:18, Яша Савельев
написал:

В данный момент я не могу повторить тест, но на шаге 4 вы поняли, что
перейти на страницу 1 после обновления (если документ изменился). Тем не менее, я не был
работает локально, но через соединение с сервером. Не уверен, что это может
разница.

Вск, 31 декабря 2017 г., 4:42, Андрей Петре [email protected]
написал:

Я изучаю это, но не знаю, понял ли я проблему очень
хорошо.

1 - Создайте локальный файл PDF (файл: //....pdf).
3 - Редактировать PDF-файл.

Итак, проблема связана только с созданием моего собственного PDF-файла? Например
создать его с помощью генератора PDF, такого как latex / jspdf?

Я сделал следующее и не смог воспроизвести:

  1. Создал себе PDF-файл и открыл его с помощью
    http: // локальный : 8888 / web / viewer.html? file = / andrei_test / a4.pdf
    http: // локальный: 8888 / web / viewer.html? file = / andrei_test / a4.pdf
  2. перешел на страницу 3.
  3. Затем отредактировал pdf (добавил больше текста на странице 3)
  4. обновился и увидел новый контент на странице 3, но я все еще
    на странице 3 pdf.js не перемещал меня на страницу 1.

Перед этим я просто попытался обновить PDF-файл по умолчанию из viewer.html a
несколько раз, и у меня создалось впечатление, что страницу не запомнили в
все. Но теперь я думаю, что понимаю, если я обновляю его слишком быстро (до
внутреннее хеширование выполняется для запоминания места для прокрутки назад после обновления),
тогда это просто приведет меня к тому, когда я был в последний раз перед моим последним свитком, а не
на мою последнюю позицию. Но если бы я потратил еще полсекунды, а затем обновился,
тогда я вижу, что все в порядке, я получаю прокручиваемую позицию до места последней прокрутки.

Так что я не совсем уверен, что мне здесь нужно. Не могли бы вы подробнее рассказать
как воспроизвести? Благодаря!

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/mozilla/pdf.js/issues/6847#issuecomment-354573873 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AGBkZqzS34MYDM8wZi41cNY0NiVUyoI-ks5tFsNqgaJpZM4HBeqE
.

Я могу подтвердить, что эта проблема воспроизводима. Не только страница переместилась назад, но и сброшено масштабирование. Я подозреваю, что это может быть связано с изменением хеша при изменении файла.

@timvandermeij Это

Я не могу понять это

BrianNgo: Я могу подтвердить, что эта проблема воспроизводима. Не только страница переместилась назад, но и сброшено масштабирование. Я подозреваю, что это может быть связано с изменением хеша при изменении файла.

@BrianNgo Вы работали локально, с кодом или как вы это проверяли? Не могли бы вы дать пошаговую информацию о воспроизведении?

Яшамон: И до сих пор удаленно работает с http-сервером

@yashamon не могли бы вы подробнее объяснить свою настройку? Это может зависеть от этого, поскольку, когда я пытался запустить локальный сервер и получить к нему доступ на localhost (например, http://localhost:8888/web/viewer.html?file=/andrei_test/a4.pdf ), я не смог воспроизвести это. Еще я использовал хром.

Jolo510: @timvandermeij Это

@ Jolo510 Это

Проблема в том, что файл изменился незначительно, но хеш изменился полностью. Для целей тестирования фактическое содержимое PDF-файла не имеет значения, вам нужно только убедиться, что тестируемые PDF-файлы имеют разные хэши.

Для более надежного воспроизведения вы можете взять набор совершенно не связанных между собой PDF-файлов (например, PDF-файлы в test/pdfs/ ) и перезаписать PDF-файл перед перезагрузкой PDF.js (с установкой просмотра на страницу 2, чтобы вы увидит разницу между страницей 1 и страницей 2). Таким образом, один и тот же путь к файлу будет указывать на другой файл, и вы сможете увидеть ошибку в действии.

@andreip Да, я тестирую его локально с помощью Chrome. Я открыл PDF-файл, аналогичный тому, что был у вас: http: // localhost : 8888 / web / viewer.html? File = / andrei_test / a4.pdf. Затем я использовал libreoffice для изменения файла и экспортировал его. Обновил страницу, и произошла ошибка.

На мой взгляд, это не совсем ошибка. Изменяя файл, приложение воспринимает текущий файл как новый (что является самым безопасным вариантом). Таким образом, приложение должно сбросить свою историю, чтобы просмотреть его как новый файл.

Реальная проблема может возникнуть при слишком быстром обновлении файла до выполнения внутреннего хеширования.

@andreip Замечательно ! Я посмотрю, репо локально.

Я планирую запустить приложение сегодня вечером локально. Затем найдите время в следующие день или два, чтобы воспроизвести ошибку и покопаться в коде.

@BrianNgo Если проблема заключается в слишком быстром обновлении файла, что можно исправить?

Есть ли в этом прогресс?

В среду, 17 января 2018 г., 23:07 Джонни Ло, [email protected] написал:

Я планирую запустить приложение сегодня вечером локально. Тогда уделите время
на следующий день или два воспроизвести ошибку и покопаться в коде.

@BrianNgo https://github.com/brianngo Если проблема тоже обновляется
быстро, что было бы потенциальным исправлением?

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/mozilla/pdf.js/issues/6847#issuecomment-358539017 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AGBkZmlmOIxzNatXTXTGW3bNaeNFkWFzks5tLtF2gaJpZM4HBeqE
.

@yashamon Нет, я не продвинулся в этом

@ Роб - W
Привет ,
Я вижу, как многие люди делают это. Попробуй. Пожалуйста, дайте мне знать, если нам нужно написать тест для этого

@ ankitverma2211 Если можно, тесты были бы отличными.
Однако у нас нет автоматизированных тестов для такого рода функций, поэтому, если патч выглядит разумно и проходит ручное тестирование, мы тоже его примем.

Я бы хотел с этого начать. кто-нибудь еще работает над этим?

Не то, что я знаю о. Не стесняйтесь работать над этим!

Конечно, я начинаю с этого и буду пинговать вас, ребята, в IRC за любой помощью

В понедельник, 24 декабря 2018 г., в 16:24 Тим ван дер Мей [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.

вот некоторая ссылка

расчет отпечатка

ссылка на stackoverflow

дайте мне знать, что вы говорите об этом. мы должны закрыть этот вопрос?

Привет, Рахул,

Это может помочь, если вы посмотрите на Sharelatex в действии, который использует pdf.js в качестве
backend и уже есть обходной путь, перерисовывая pdf-файлы после латексного источника
изменение кода, которое обязательно изменит любой хеш, сохраняя при этом просмотр
должность. Я считаю, что их расширения имеют открытый исходный код на github, но не
подготовить ссылку.

В пятницу, 28 декабря 2018 г., в 15:01 Рахул Шарма [email protected]
написал:

@timvandermeij https://github.com/timvandermeij Я прошел через
весь код, который задействован при рендеринге pdf файла.
Он использует локальное хранилище для хранения в pdfjs истории просмотра с файлами как
массив. В котором каждый элемент хранит отпечаток файла и другие
метаданные о последней истории просмотров. когда мы изменяем отпечаток файла
файл изменяется, и для этого нового отпечатка пальца у нас нет представления
история.

мой старый отпечаток файла => 14ecd8cdbbf6f76f04030d59025b5937

отпечаток пальца после смены файла => 619c4c4f872e96e6514b25c6a1ae03f2

Насколько я прошел расчет отпечатков пальцев для документа, это зависит
о содержании и трейлере в формате pdf.

вот некоторая ссылка

расчет отпечатка
https://github.com/mozilla/pdf.js/blob/58c3ea08202becf007c304512c44726719acb508/src/core/core.js#L513

ссылка на stackoverflow
https://stackoverflow.com/questions/33309378/using-fingerprint-generated-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
.

будет очень полезно, если вы можете поделиться ссылкой на репо, которое отвечает за это, и тогда это будет функция этого репо, а не ошибка

Раньше у меня был скрипт greasemonkey, который заменял клавишу «Cr» на щелчок «viewBookmark», что в основном решало эту проблему для меня. Это не работало после какой-то версии Firefox. Похоже, что greasemonkey не загружен в pdf.js. Это предназначено?

РЕДАКТИРОВАТЬ: после небольшого поиска я думаю, что это намеренно - https://discourse.mozilla.org/t/extensions-on-pdfjs-pages/28441

@timvandermeij @yashamon

Я смотрел репо Sharelatex. они делают это, используя отслеживание pdfjs.history с помощью projectId, а не отпечатка пальца, который изменяется при изменении документа, но projectId для этого конкретного документа остается таким же для sharelatex.

У меня есть несколько вопросов. Я пытался связаться с вами, ребята, в IRC, но не получил ответа

Вопросов:

  1. нам нужно поддерживать номер страницы также, когда PDF изменяется, и пользователь открывает новый файл в новой вкладке.
    как это поддерживается в текущем методе отпечатков пальцев.
  2. Если это должно быть только в текущей вкладке, мы можем использовать сеансы, иначе мы добавим еще несколько ключей в view_history.
    пожалуйста, направь меня

Исправлено в # 10424.

Просто протестировал это, все такое же поведение. Обновление страницы исправляет положение просмотра страницы только в том случае, если файл pdf не изменился, иначе просмотр переходит на первую страницу. Это очень легко проверить с помощью латекса, выберите документ, скомпилируйте и просмотрите pdf, добавьте случайное слово в источник латекса, перекомпилируйте и просмотрите pdf, предварительный просмотр pdfjs перейдет на первую страницу. У меня версия 2.2.191 в хроме. Проверю в firefox, когда у меня будет возможность.

Я тестировал с помощью firefox, похоже, что в последней версии проблема исправлена, так что просто версия Chrome отстает?

Версия расширения Chrome включает этот патч. Его поведение может отличаться из-за разницы в поведении браузера. Однажды я опубликовал подробное описание проблемы на https://github.com/mozilla/pdf.js/commit/cdea75dc397f4eb4d6fd1f7d8a388c7d11df3452 (который был частью https://github.com/mozilla/pdf.js/pull/6200). .

Я отправил аналогичную проблему № 11359 в отношении * PDF-файла, созданного латексом. На самом деле неверно, что здесь используется «хеш на основе содержимого файла» @ Rob - W. Скорее, это идентификатор, встроенный в PDF-файл при создании, и то, как этот идентификатор создается, зависит от генерирующего приложения, для * latex это хэш, основанный на комбинации текущего времени и пути к текс-файлу. См. Мой последний комментарий для решения.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги