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

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

47 голосов
/ 08 ноября 2010

Я хочу конвертировать 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 различных текстовых блоков.Есть ли способ исправить вышеуказанный код?или, пожалуйста, предложите другое решение, которое будет работать более эффективно.

Ответы [ 3 ]

55 голосов
/ 08 ноября 2010

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 system call" даст больше информации о том, как правильно выполнить эту часть.

33 голосов
/ 21 декабря 2010

Взгляните на 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/

1 голос
/ 10 октября 2017
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
...