سؤال

أرغب في تحويل 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 في محرر النصوص. إنه يرفق كل حرف في المستند الأصلي في كتلة خاصة به حتى لو كانت خصائص الخط من الأحرف هي نفسها. على سبيل المثال ، ستظهر كلمة Hello كـ 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" بعد ذلك. في أي حال ، ستؤدي Googling "Java System Call" إلى مزيد من المعلومات حول كيفية القيام بهذا الجزء بشكل صحيح.

نصائح أخرى

ألق نظرة على 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/

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top