Редактировать * существующий * PDF в браузере

у меня есть веб-приложение, которое в настоящее время получает представление base64 PDF с сервера. Я могу использовать pdf-файл Mozilla.js, чтобы отобразить это на <canvas> и переключаться через страницы с выпадающим списком.

в соответствии со всем, что я смог найти и можете в формате PDF в Mozilla.Яш изменять PDF-файлы?, невозможно редактировать PDF с помощью pdf.js.

Я нашел jsPDF и пока я могу взять холст и сделать .toDataURL() С это для каждой страницы и построить новый PDF документ с ним, но есть два вопроса:

  1. недавно сгенерированный PDF будет просто серией изображений на каждой странице, поэтому любой текст в оригинальном PDF будет просто изображением после того, как я закончу с ним.
  2. Я создаю новый PDF с jsPDF, а затем отправляю base64 обратно в pdf.JS, чтобы отобразить его на холсте. Что-то происходит между этими шагами, когда изображения страниц масштабируются неправильно, поэтому каждая страница занимает около 3/4 холста после каждого нового изменения PDF. Я не смог заставить его сохранить тот же размер/масштаб.

jsPDF не похоже, что у него есть способ загрузить существующий PDF, он только создает новые. и PDFKit также похоже, что они создают только новые PDF-файлы.


мой вопрос:

есть ли что-нибудь, что позволит как просматривать pdf (из base64), так и вносить в него изменения? В идеале я бы следите за изменениями на холсте, а затем нарисуйте это изменение на странице pdf. После этого экспортируйте это в строку base64 для отправки обратно на сервер.

3 ответов


быстрый ответ-нет, и маловероятно, что вы найдете кросс-браузерное решение. Очень маловероятно, что вы найдете PDF-идеальное решение. Лучше подумать о том, чтобы пользователи редактировали HTML и создавали PDF на сервере.

Почему - формат PDF является одновременно блестящим и дьявольским. Гениально из-за своей удобоносимости, но дьявольски из-за внутренней структуры и механизмов хранения. Нет дружественного "DOM", как с HTML. Если бы мы были начиная заново, чтобы разработать портативный формат документа, мы бы не выбрали PDF. Но PDF в настоящее время имеет слишком много импульса, чтобы быть выброшенным, период.

молодые зрители могут задаваться вопросом, как, черт возьми, этот маниакальный формат попал в лидирующие позиции на рынке и откуда он взялся. Ну, когда отцы-основатели PDF закладывали дизайн, до XML, JSON, HTML и даже Интернета, они не работали с сегодняшним обменом документами в виду. Они были работа над лучшим способом кодирования инструкций по печати-концепция драйвера принтера PostScript. Они никогда не должны были редактироваться до того, как принтер поглотит их, и они были бесполезны для любой другой цели. Затем кто-то заметил, что вы можете интерпретировать инструкции по рисованию PostScript на экране, и впоследствии кто-то заметил фантастический потенциал использования этого в качестве переносимой концепции перекрестного отображения устройства. И вот мы здесь.

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

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

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

учитывая многослойность, масштабирование и вращение объектов в PDF, вы, вероятно, будете смотреть на HTML-холст в качестве поверхности рисования. Кто-нибудь кто знает, скажет вам, что в мире canvas вы в значительной степени сами по себе для функций типа обработки текста.

Не невозможно, но трудно.

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

вы найдете много продуктов "сохранить в pdf". Когда клиентская сторона будет склоняться к захвату набора пикселей и сбросу растровой графики в файл с тончайшей облицовкой определения "PDF", обернутой вокруг него. Там, где они основаны на сервере, они могут быть довольно мощными - есть много инструментов, таких как Aspose и ABCPDF, которые действительно предлагают некоторую сторону сервера PDF - но это не то, что вы ищете в своей операции.

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

Если вы ищете онлайн-редактирование документов, которые в конечном итоге экспортируются как PDF, то путь вперед-сохранить html-версию источника документа и заставить пользователя редактировать это с помощью TinyMCE, CKEditor, и т. д., затем используйте один из инструментов на стороне сервера, чтобы взять сохраненный исходный HTML и отобразить в PDF. Такие инструменты, как ABCPDF render HTML, позволяют добавлять изображения, верхние и нижние колонтитулы, номера страниц и т. д.

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

Заключительные мысли-переосмыслите объем того, что вам нужно. Если редактирование HTML и преобразование в PDF на сервере можно использовать для вас, это хорошо протоптанный путь, и вы найдете как бесплатные, так и коммерческие компоненты для клиента и сервера для его поддержки.

Edit: Если вам нужно аннотировать PDF, то все намного проще. На сервере необходимо сгенерировать изображения страниц документа, отправить их клиенту, отобразить их пользователю, позволить пользователю пометить их, захватите координаты аннотаций обратно на сервер и используйте библиотеку PDF на стороне сервера для отображения аннотаций в PDF. Это достижимо, хотя требует различных наборов навыков для серверной части PDF для обработки изображений и презентации на стороне клиента и захвата аннотаций.


потому что здесь направляются другие вопросы SO, и учитывая, как быстро продвигаются веб-технологии (например, WASM), я предоставляю следующий ответ. Хотя PDFNetJS смог сделать все это, когда вопрос был первоначально задан.

поскольку требование " редактировать "было уточнено как"В основном то, что необходимо для пользователей, чтобы открыть ранее загруженный PDF, выделить или обвести разделы, а затем сохранить эти аннотации в PDF обратно на сервере." и "нет редактирования текста или манипуляции с документом contant должно произойти.", то да это возможно абсолютно в любом современном браузере на любом современном устройстве.

PDFTron PDFNet SDK для может сделать все это. Полноценный, из коробки просмотра документов предоставляется, с полной поддержкой аннотаций. Также можно фактически редактировать PDF (изменять / заменять текст, редактировать, извлекать/добавлять / заменять изображения и многое другое). Не только PDF файлы поддерживаются напрямую клиентская сторона, но так же DOCX, PPTX, XLSX, PNG и JPG. Файлы могут быть загружены локально или удаленно, и нет необходимости в медленном кодировании/декодировании base64.

демо:http://www.pdftron.com/webviewer

образцы:http://www.pdftron.com/documentation/web/samples/universal-samples

исходный вопрос был также для поддержки Siebel и "PDFNetJS пытается получить .файл mem, который является двоичными данными. Этот не может обслуживаться приложением, которое я использую (Siebel), поэтому не похоже, что это вариант.".

The .файл mem предназначен для PNaCl, который является только Chrome, и его можно отключить. PDFTron для Web поддерживает WASM и даже emscripten, один из которых, если не оба, должен быть совместим с Siebel.


Для справки:

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