конвертировать PDF в SVG

Я хочу преобразовать PDF в SVG, пожалуйста, предложите несколько библиотек / исполняемых файлов, которые смогут сделать это эффективно. Я написал свою собственную java-программу, используя библиотеки apache PDFBox и Batik -

PDDocument document = PDDocument.load( pdfFile );
DOMImplementation domImpl =
    GenericDOMImplementation.getDOMImplementation();

// Create an instance of org.w3c.dom.Document.
String svgNS = "http://www.w3.org/2000/svg";
Document svgDocument = domImpl.createDocument(svgNS, "svg", null);
SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(svgDocument);
ctx.setEmbeddedFontsOn(true);

// Ask the test to render into the SVG Graphics2D implementation.

    for(int i = 0 ; i < document.getNumberOfPages() ; i++){
        String svgFName = svgDir+"page"+i+".svg";
        (new File(svgFName)).createNewFile();
        // Create an instance of the SVG Generator.
        SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx,false);
        Printable page  = document.getPrintable(i);
        page.print(svgGenerator, document.getPageFormat(i), i);
        svgGenerator.stream(svgFName);
    }

Это решение отлично работает, но размер результирующих файлов svg огромен (во много раз больше, чем у pdf). Я выяснил, в чем проблема, посмотрев на svg в текстовом редакторе. он заключает каждый символ в исходном документе в отдельный блок, даже если свойства шрифта символов одинаковы. Например, слово "привет" появится в виде 6 различных текстовых блоков. Есть ли способ исправить приведенный выше код? или предложите другое решение, которое будет работать более эффективно.


person user434541    schedule 08.11.2010    source источник


Ответы (6)


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

Чтобы использовать интерфейс командной строки Inkscape для преобразования PDF в SVG, используйте:

inkscape -l out.svg in.pdf

Что вы, вероятно, можете вызвать, используя:

Runtime.getRuntime().exec("inkscape -l out.svg in.pdf")

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29

Я думаю, что exec () является синхронным и возвращается только после завершения процесса (хотя я не уверен в этом на 100%), поэтому после этого вы можете просто прочитать "out.svg". В любом случае, поиск в Google «системный вызов java» даст больше информации о том, как сделать эту часть правильно.

person jbeard4    schedule 08.11.2010
comment
спасибо, что команда inkscape, похоже, работает, однако она преобразует только первую страницу, знаете ли вы о параметре командной строки, который будет создавать 1 svg для каждой страницы? - person user434541; 08.11.2010
comment
Я не знаю, как это сделать, и на странице руководства inkscape, похоже, не указано, что эта функция доступна в интерфейсе командной строки. Я предполагаю, что вы можете добавить этот интерфейс самостоятельно, изменив код inkscape. Или вы можете сделать что-то очень хитрое и креативное и использовать такую ​​программу, как ghostscript, чтобы разделить PDF-файл на несколько одностраничных документов, а затем подать каждую страницу индивидуально в inkscape. - person jbeard4; 09.11.2010
comment
Вероятно, лучшее решение - разделить файл pdf по одному файлу на страницу. И pdfjam, и pdftk могут это сделать. - person hlovdal; 29.08.2011
comment
Ответ @ Koen. Указывает на pdf2svg, который может работать с несколькими страницами: pdf2svg input.pdf output_page%d.svg all - person alxndr; 10.02.2013
comment
Я знаю, что это старый, но я также заметил раздувание inkscape (например, удвоение групп) при работе с .pdf. Когда у вас есть .svgs, есть утилита очистки под названием scour, которая может помочь. - person Chris H; 15.08.2013
comment
Я использовал подход командной строки inkscape, но шрифты выглядят ужасно в svg. Есть способ исправить? - person remus; 08.10.2013
comment
Для людей, которые нашли это решение в 2017 году: эта опция ужасно не работает в Windows, где появляется диалоговое окно настроек импорта PDF, которое необходимо подтвердить, что делает это решение непригодным для автоматизированных сборок. - person Mike 'Pomax' Kamermans; 27.02.2017
comment
С тобой согласен Майк. любое решение для запуска этого в командной строке с использованием последней версии Inkscape? - person Mah Jin Khai; 29.05.2018
comment
Я не тестировал это с Windows, но --pdf-poppler у меня работает с inkscape 1.0 в Linux. Если кому-то интересно, я использую полную команду inkscape --pdf-poppler in.pdf -T -l -o out.svg, которая преобразует шрифты в пути. - person MattHusz; 23.07.2020

Взгляните на pdf2svg:

Для использования

pdf2svg <input.pdf> <output.svg> [<pdf page no. or "all" >]

При использовании all укажите в имени файла %d (который будет заменен номером страницы).

pdf2svg input.pdf output_page%d.svg all

А для устранения некоторых неполадок см .: http://www.calcmaster.net/personal_projects/pdf2svg/

person Koen.    schedule 21.12.2010
comment
Я использовал pdf2svg, но только что обнаружил, что это скорее приближение, чем inkscape. В частности, вы теряете детали при рендеринге маленьких кругов (я имею дело с PDF-файлами, состоящими из 100 000 путей). YMMV. - person Aidan Kane; 28.11.2012
comment
@AidanKane: С другой стороны, pdf2svg работает лучше, чем Inkscape для текста; текст из выходного файла LaTeX не отображался в выходных данных Inkscape для меня. - person Mechanical snail; 24.02.2014
comment
@Mechanicalsnail: Сейчас у меня гораздо больше опыта в этом. Вы правы, бывают случаи, когда я обнаруживал, что в преобразованиях inkscape чего-то не хватает, и pdf2svg в порядке. pdf2svg был обновлен для вызова другой функции в cairo для выполнения рендеринга (что устранило проблему, которую я описал ранее). К сожалению, это происходит за счет отсутствия текста в svgs - все глифы преобразуются в пути. Я пропатчил cairo и poppler, чтобы текст снова работал, но я не совсем доверяю своему хаку :) - person Aidan Kane; 24.02.2014
comment
и inkscape, и dvisvgm не могут создать правильный svg из латекса. pdf2svg может. - person ivo Welch; 02.03.2014

pdftocairo можно использовать для преобразования PDF в SVG. pdfcairo является частью poppler-utils.

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

pdftocairo -svg -f 1 -l 1 input.pdf
person SuperNova    schedule 22.04.2020
comment
На мой взгляд, лучший ответ, самое простое решение. - person deeenes; 16.07.2020

pdftk 82page.pdf burst
sh to-svg.sh 

содержимое to-svg.sh

#!/bin/bash
FILES=burst/*
for f in $FILES
do
  inkscape -l "$f.svg" "$f"
done
person Leblanc Meneses    schedule 10.10.2017

Я столкнулся с проблемами с предложенными inkscape, pdf2svg, pdftocairo, а также с не предлагаемыми convert и mutool при попытке конвертировать большие и сложные PDF-файлы, такие как некоторые топографические карты из Геологической службы США. Иногда они давали сбой, иногда создавали сильно раздутые файлы. Единственным инструментом преобразования PDF в SVG, который смог правильно обработать их все для моего варианта использования, был dvisvgm. Использовать его очень просто:

dvisvgm --pdf --output=file.svg file.pdf

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

person MrDrMcCoy    schedule 21.05.2021

inkscape (@jbeard4) для меня были созданы svgs без текста вообще, но я смог заставить его работать, перейдя постскриптум в качестве посредника с помощью ghostscript.

for page in $(seq 1 `pdfinfo $1.pdf | awk '/^Pages:/ {print $2}'`)
do
    pdf2ps -dFirstPage=$page -dLastPage=$page -dNoOutputFonts $1.pdf $1_$page.ps
    inkscape -z -l $1_$page.svg $1_$page.ps
    rm $1_$page.ps
done

Однако это немного громоздко, и победителем по простоте использования должен стать pdf2svg (_4 _), поскольку у него есть флаг all, поэтому вам не нужно зацикливаться.

Однако pdf2svg недоступен в CentOS 8, и для его установки вам необходимо сделать следующее:

git clone https://github.com/dawbarton/pdf2svg.git && cd pdf2svg
#if you dont have development stuff specific to this project
sudo dnf config-manager --set-enabled powertools
sudo dnf install cairo-devel poppler-glib-devel
#git repo isn't quite ready to ./configure
touch README
autoreconf -f -i
./configure && make && sudo make install

Он создает svgs, которые на самом деле выглядят лучше, чем приведенный выше ghostscript-inkscape, шрифт кажется растровым лучше.

pdf2svg $1.pdf $1_%d.svg all

Но эта установка - это слишком много, даже если у вас нет sudo. Кроме того, pdf2svg не поддерживает stdin / stdout, поэтому легко доступный pdftocairo (@SuperNova) отлично поработал. С уважением, и вот пример расширенного использования ниже:

for page in $(seq 1 `pdfinfo $1.pdf | awk '/^Pages:/ {print $2}'`)
do
    pdftocairo -svg -f $page -l $page $1.pdf - | gzip -9 >$1_$page.svg.gz
done

Это создает файлы того же качества и размера (до сжатия), что и pdf2svg, хотя и не бинарно-идентичные (и даже визуально, переходя между выходными данными двух пикселей смещения букв, но ни один из них не выглядит неправильно / плохо, как в inkscape).

person Hashbrown    schedule 07.05.2021