Замена векторных изображений в PDF растровыми изображениями

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

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

Меня интересуют любые возможные решения, но предпочтительнее будет решение на базе Linux или Windows.


person Michael Boyer    schedule 07.03.2012    source источник
comment
Примечание: этот вопрос изначально был размещен на на сайте TeX, но тамошние моды предложили мне спросить его здесь.   -  person Michael Boyer    schedule 07.03.2012
comment
Вы можете экспортировать все страницы в изображения, а затем создать PDF-файл, используя эти изображения. Есть много приложений, которые могут это сделать. Я думаю, что подойдет комбинация imagemagick и / или ghostscript. Для программистов я написал статью под названием ‹a href=gnostice.com/ Растеризация PDF-документа в .NET ‹/a›, где показано, как это сделать с помощью нашего продукта PDFOne .NET.   -  person BZ1    schedule 08.03.2012
comment
Но я хочу растрировать только изображения / рисунки в PDF, а не текст. Я не вижу способа сделать это с помощью ImageMagick. Я посмотрю на Ghostscript.   -  person Michael Boyer    schedule 08.03.2012
comment
@MichaelBoyer Если вы не запрашиваете решение для данной структуры (например, .NET, JAVA, Windows, Linux), этот вопрос кажется более подходящим для сайта SuperUser, чем для StackOverflow.   -  person Danny Varod    schedule 03.02.2013


Ответы (8)


У меня была аналогичная проблема, и я решил ее с помощью инструмента преобразования ImageMagics (http://www.imagemagick.org/script/index.php). Это идет с Linux и отлично работает в Windows / Cygwin или OS X

convert -density 300 largeVectorFileFromR.pdf out.pdf

С -плотностью 300 вы управляете разрешением (как DPI).

Оборотная сторона: текст тоже растеризуется, я понимаю, что Майкл этого не хочет.

person vertikalist    schedule 01.07.2013
comment
Пользователи, столкнувшиеся с no images defined ошибкой, должны будут установить необходимую gs зависимость ghostscript. Для пользователей MacOS с Homebrew: brew install ghostscript - person Mark Egge; 19.09.2017

После нескольких дней поиска решения на основе "Удалить весь текст из файла PDF "и" Как добавить изображение к существующему pdf? "Я нашел (уродливое) решение с поддержкой сценариев:

gs -o /tmp/onlytxt.pdf -sDEVICE=pdfwrite -dFILTERVECTOR -dFILTERIMAGE $INPUT_FILE && \
gs -o /tmp/graphics.pdf -sDEVICE=pdfwrite -dFILTERTEXT $INPUT_FILE && \
convert -density $DPI -quality 100 /tmp/graphics.pdf /tmp/graphics.png && \
convert -density $DPI -quality 100 /tmp/graphics.png /tmp/graphics.pdf && \
pdftk /tmp/graphics.pdf stamp /tmp/onlytxt.pdf output $OUTPUT_FILE && \
rm /tmp/onlytxt.pdf /tmp/graphics.pdf /tmp/graphics.png

были у нас три переменные INPUT_FILE, OUTPUT_FILE и DPI. Мы разделяем текстовое и графическое содержимое с помощью Ghostscript, конвертируем графическое изображение в растровое изображение (PNG) и объединяем их с помощью pdftk.

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

person Civ Lins    schedule 20.12.2017
comment
В более поздних версиях ImageMagick такие операции с PDF запрещены по умолчанию, поэтому /etc/ImageMagick-7/policy.xml необходимо отредактировать (см. здесь < / а>) - person Silmathoron; 16.04.2019
comment
также для людей, которые могут захотеть сделать это для многостраничного PDF-файла, pdftk предлагает эквивалентный multistamp вариант - person Silmathoron; 16.04.2019

Это немного сложно, но вы просили любое возможное решение. Кроме того, это решение нельзя автоматизировать.

1) Откройте pdf-файл с векторными изображениями в Inkscape. Затем выберите все изображение с помощью инструмента select (F1).

2) Если векторное изображение состоит из более чем одной графики svg, нажмите Ctrl + G (Объект -> Группа)

3) вырезать сгруппированное изображение svg Ctrl + x

4) откройте новое окно InkScape Ctrl + n и вставьте изображение Ctrl + v

5) выберите Файл -> экспортировать растровое изображение (Shift + Ctrl + e), возможно, вы хотите увеличить dpi

6) вернитесь в первое окно InkScape, File -> import (Ctrl + i) и выберите ранее экспортированное растровое изображение.

7) поместите растровое изображение в то место, где было изображение svg

Сохраните PDF-файл, и векторное изображение будет заменено растровым изображением.

person Martin Grohmann    schedule 06.02.2013
comment
Очень сложно и трудоемко. Ищу более автоматизированную версию и подумал, что такой скрипт где-то должен существовать. - person data; 07.02.2013
comment
Да, я подумал, что вам нужен скриптовый способ. Но я подумал, что после 11 месяцев без единого ответа, я, по крайней мере, поделюсь возможным путем. - person Martin Grohmann; 08.02.2013

Вот один из способов решить вашу проблему:

Шаг 1. Воспользуйтесь онлайн-конвертером PDF в HTML, например, здесь:

http://www.idrsolutions.com/online-pdf-to-html5-converter/

Этот инструмент преобразует PDF-файл в набор изображений и текстовый оверлей. На этом этапе векторные изображения должны быть преобразованы в растровые.

Шаг 2: конвертируйте изображения HTML + обратно в PDF:

http://pdfcrowd.com/#convert_by_upload+with_options

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

person Hari    schedule 07.02.2013
comment
Проблема для меня в том, что для многих PDF-файлов pdf2html не может правильно анализировать PDF-файл, что делает это неэффективным. - person data; 07.02.2013
comment
Другая проблема заключается в том, что текст внутри рисунков должен быть растрирован вместе с остальными рисунками; например, подумайте о метках на осях графика. Это решение (pdf2html) оставляет этот текст как текст, поэтому растеризованный рисунок получается неполным. - person Michael Boyer; 07.02.2013
comment
Кроме того, неясно, как вы могли бы использовать это для PDF-файла с более чем одной страницей. - person Michael Boyer; 07.02.2013
comment
pdf2html основан на xpdf, поэтому он менее эффективен, чем некоторые из более поздних библиотек PDF. Я рекомендую вам загрузить (или попробовать онлайн-версию) конвертера PDF-to-HTML JPedal, ссылка на который приведена в ответе. Он позволяет создавать один файл HTML для нескольких страниц. Кроме того, не могли бы вы приложить к вопросу образец PDF-файла? Я немного работаю с PDF и могу что-нибудь придумать. (Нет связи с сайтами, указанными выше.) - person Hari; 08.02.2013

Pitstop Pro v2 update 3 от Enfocus может сделать именно это. У него есть действие под названием «Растрировать содержимое страницы с сохранением текста», которое работает довольно хорошо. Это плагин для Adobe Acrobat, поэтому он требует немного больше, но также доступен в качестве серверного решения.

person fltman    schedule 14.11.2014
comment
Добро пожаловать в stackoverflow. Вышеупомянутое сообщение может дать ответ на вопрос, но небольшое дополнительное объяснение может помочь другим программистам понять, как это работает. - person Nagama Inamdar; 14.11.2014

Преобразуйте PDF в djvu с помощью конвертера https://jwilk.net/software/pdf2djvu. Снимите флажок «сглаживание шрифтов, векторов ..». Это значительно уменьшит размер файла и сократит время загрузки документа.

person not_a_spammer    schedule 16.12.2017

Я использовал следующее:

gswin32c -o "%2" -dFirstPage=1 -dLastPage=1 -sDEVICE=pngalpha -r72x72 -dUseCropBox -dFitPage "%1" -dBATCH -dNOPAUSE

где %1 - входной файл, а %2 - выходной. Это можно использовать с LaTeX, сгенерированный PNG имеет то же соотношение сторон и размер страницы, что и исходный PDF-файл, поэтому относительное положение изображения не изменится.

Обратите внимание, что в Linux вам может потребоваться использовать gs, а не gswin32c.

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

person the swine    schedule 15.11.2016

inkscape - лучшее решение, я быстро создал этот довольно неоптимизированный командный файл, который делает именно это, и вы можете поиграть с ним и изменить параметры. ImageMacick convert, gs или pdftoimages работают не так хорошо, как inkscape, они либо не экспортируют слои, либо экспортируют, но с плохим качеством:

#!/bin/bash
#set -xev
ORIGINAL_FOLDER=`pwd` 
JPEGS=`mktemp -d`
unzip "$1" -d "$JPEGS"
cd "$JPEGS"
# expang the pdf in pdf pages
pdftk combined_to_do.pdf burst output pg_%04d.pdf
#1) print the pdf's to pngs as they are seen with alpha, layers, transparency etc, this cannot be done by ImageMacick convert or pdftoimages
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png
#2) Second change to jpgs
rm *.pdf
ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300  {}.jpg
#3) This to make a pdf file out of every jpg image without loss of either resolution or quality:
ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
#4) This to concatenate the pdfpages into one:
pdftk *.jpg.pdf cat output combined.pdf
#5) And last I add an OCRed text layer that doesn't change the quality of the scan in the pdfs so they can be searchable:
pypdfocr combined.pdf
cp "$JPEGS/combined_ocr.pdf" "$ORIGINAL_FOLDER/$1_ocr.pdf"
cp "$JPEGS/combined.pdf" "$ORIGINAL_FOLDER/$1.pdf"
person Eduard Florinescu    schedule 13.02.2018