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

Има ли някакъв лесен (със скрипт) начин за конвертиране на PDF с векторни изображения в PDF с растерни изображения? С други думи, искам да генерирам PDF с абсолютно същия (не растеризиран) текст, но с всяко векторно изображение, заменено с растеризирана версия.

От време на време чета PDF файлове с технически статии на моя Kindle и открих, че директното четене на PDF е разочароващо. За щастие автоматичното преобразуване на PDF файлове в Kindle на Amazon 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

С -density 300 контролирате разделителната способност (като DPI).

Недостатък: Текстът също е растеризиран, разбирам, че Майкъл не иска това.

person vertikalist    schedule 01.07.2013
comment
Потребителите, срещащи no images defined грешка, ще трябва да инсталират необходимата ghostscript gs зависимост. За потребители на 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) изберете File --> export Bitmap (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 библиотеки. Бих ви насърчил да изтеглите (или да опитате онлайн версията на) конвертора на JPedal PDF към HTML, към който има връзка в отговора. Позволява генерирането на един HTML файл за множество страници. Освен това бихте ли прикачили примерен PDF към въпроса? Работя доста с PDF и може би ще успея да измисля нещо. (Няма връзка със сайтовете, към които има връзка по-горе.) - person Hari; 08.02.2013

Pitstop Pro v2 актуализация 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