2010-11-08 12 views
39

कनवर्ट करना मैं पीडीएफ को एसवीजी में कनवर्ट करना चाहता हूं कृपया कुछ पुस्तकालयों/निष्पादन योग्य सुझाव दें जो इसे कुशलतापूर्वक करने में सक्षम होंगे।पीडीएफ को 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); 
    } 

यह समाधान अच्छा काम करता है, लेकिन इसे भरपूर है, जिसके परिणामस्वरूप svg फ़ाइलों का आकार (कई बार पीडीएफ से अधिक) -। मैं अपने खुद के जावा कार्यक्रम अपाचे PDFBox और बाटिक लाइब्रेरी का उपयोग कर लिखा है। मैंने यह पता लगाया है कि पाठ संपादक में svg को देखकर समस्या कहां है। यह मूल दस्तावेज़ में प्रत्येक चरित्र को अपने ब्लॉक में संलग्न करता है भले ही वर्णों के फ़ॉन्ट गुण समान हों। उदाहरण के लिए हैलो शब्द 6 अलग-अलग टेक्स्ट ब्लॉक के रूप में दिखाई देगा। क्या उपरोक्त कोड को ठीक करने का कोई तरीका है? या कृपया एक और समाधान सुझाएं जो अधिक कुशलतापूर्वक काम करेगा।

उत्तर

49

इंकस्केप का उपयोग पीडीएफ को एसवीजी में बदलने के लिए भी किया जा सकता है। यह वास्तव में उल्लेखनीय रूप से अच्छा है, और यद्यपि जो उत्पन्न होता है वह थोड़ा सा फूला हुआ होता है, कम से कम, ऐसा लगता है कि आपके पास आपके प्रोग्राम में कोई विशेष समस्या नहीं है। मुझे लगता है कि इसे सीधे जावा में एकीकृत करना चुनौतीपूर्ण होगा, लेकिन इनक्स्केप इस कार्यक्षमता के लिए एक सुविधाजनक कमांड लाइन इंटरफेस प्रदान करता है, इसलिए शायद इसे एक्सेस करने का सबसे आसान तरीका सिस्टम कॉल के माध्यम से होगा।

इंकस्केप के कमांड लाइन इंटरफेस का उपयोग करने के लिए एक एसवीजी के लिए एक पीडीएफ कन्वर्ट करने के लिए, का उपयोग करें:

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" पढ़ने में सक्षम हो सकते हैं। किसी भी मामले में, "जावा सिस्टम कॉल" गूगलिंग से उस हिस्से को सही तरीके से कैसे किया जाए, इस बारे में अधिक जानकारी मिलेगी।

+0

धन्यवाद की सामग्री इंकस्केप आदेश तथापि काम करने के लिए यह केवल प्रथम पृष्ठ धर्मान्तरित लगता है कि, यू का पता चलेगा एक कमांड लाइन विकल्प जो प्रत्येक पृष्ठ के लिए 1 svg उत्पन्न करेगा? – user434541

+1

मुझे ऐसा करने का कोई तरीका नहीं पता है, और इंकस्केप मैन पेज यह इंगित नहीं करता है कि यह कार्यक्षमता कमांड लाइन इंटरफ़ेस में उजागर हुई है। मुझे लगता है कि आपके विकल्प इन इंटरफेस को इनक्सस्केप कोड को संशोधित करके जोड़ना होगा। या, आप कुछ बहुत ही हास्यास्पद और रचनात्मक कुछ कर सकते हैं, और पीडीएफ को एकाधिक एकल-पेज दस्तावेज़ों में विभाजित करने के लिए भूत-स्क्रिप्ट जैसे प्रोग्राम का उपयोग कर सकते हैं और फिर प्रत्येक पृष्ठ को व्यक्तिगत रूप से इनक्सकेप में फ़ीड कर सकते हैं। – jbeard4

+1

शायद सबसे अच्छा समाधान पीडीएफ फ़ाइल को प्रति पृष्ठ एक फ़ाइल में विभाजित करना है। दोनों पीडीएफजेम और पीडीएफटीके ऐसा कर सकते हैं। – 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

मैं पीडीएफ 2 एसवीजी का उपयोग कर रहा था लेकिन मुझे अभी पता चला है कि यह इंकस्केप की तुलना में अनुमान का अधिक है। विशेष रूप से आप छोटी सर्किलों को प्रस्तुत करते समय विस्तार से ढीला करते हैं (मैं पथों के 100,000 के पीडीएफ से निपट रहा हूं)। YMMV। –

+2

@ एडनकेन: दूसरी तरफ, पीडीएफ 2 एसवीजी टेक्स्ट के लिए इंकस्केप से बेहतर है; लाटेक्स आउटपुट फ़ाइल से टेक्स्ट मेरे लिए इंकस्केप के आउटपुट में दिखाई नहीं दिया था। –

+0

@Mechanicalsnail: मुझे अब इसके साथ बहुत अधिक अनुभव है। आप सही हैं, ऐसे समय हैं जहां मुझे इनक्सस्केप रूपांतरणों से गुम चीजें मिली हैं - और पीडीएफ 2 एसवीजी ठीक है। pdf2svg को प्रतिपादन करने के लिए कैरो में एक अलग फ़ंक्शन को कॉल करने के लिए अपडेट किया गया था (जिसने मैंने पहले वर्णित समस्या को ठीक किया था)। दुर्भाग्य से यह svgs में कोई पाठ होने की लागत पर आता है - सभी ग्लिफ पथ में परिवर्तित हो जाते हैं। मैंने फिर से काम करने के लिए कैरो और पॉपप्लर को पैच किया लेकिन मुझे पूरी तरह से मेरा हैक पर भरोसा नहीं है :) –

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