2010-11-08 5 views
39

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

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); 
    } 

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

ответ

49

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

+0

спасибо, что команда Inkscape, кажется, работает, однако она преобразует только первую страницу, делать и не знает параметр командной строки, который будет генерировать 1 svg для каждой страницы? – user434541

+1

Я не знаю, как это сделать, а страница inkscape man, похоже, не указывает, что эта функция отображается в интерфейсе командной строки. Я полагаю, что ваши варианты будут заключаться в том, чтобы добавить этот интерфейс самостоятельно, изменив код inkscape. Или вы можете сделать что-то очень взломанное и креативное, и использовать такую ​​программу, как ghostscript, чтобы разделить PDF на несколько одностраничных документов, а затем поместить каждую страницу по отдельности в inkscape. – jbeard4

+1

Возможно, лучшим решением будет разбиение файла PDF на один файл на страницу. И pdfjam, и pdftk могут это сделать. – hlovdal

30

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

+3

Я использовал pdf2svg, но я только что обнаружил, что это гораздо больше приближения, чем inkscape. В частности, вы теряете детали при рендеринге небольших кругов (я имею дело с pdf-файлами из 100 000-х путей). YMMV. –

+2

@AidanKane: С другой стороны, pdf2svg лучше, чем Inkscape для текста; текст из выходного файла LaTeX не отображался для вывода Inkscape для меня. –

+0

@Mechanicalsnail: У меня теперь много опыта с этим. Вы правы, бывают случаи, когда я обнаружил недостатки в преобразованиях inkscape - и pdf2svg в порядке. pdf2svg был обновлен для вызова другой функции в cairo для выполнения рендеринга (который исправил проблему, о которой я говорил ранее). К сожалению, это происходит за счет отсутствия текста в svgs - все глифы преобразуются в пути. Я исправил cairo и poppler, чтобы снова работать текст, но я не полностью доверяю своему хаку :) –

1
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 
Смежные вопросы