แปลง PDF เพื่อล้าง SVG? [ปิด]


115

ฉันกำลังพยายามแปลง PDF เป็น SVG อย่างไรก็ตามสิ่งที่ฉันใช้อยู่ในขณะนี้จะจับคู่เส้นทางสำหรับตัวอักษรทุกตัวในทุกข้อความซึ่งหมายความว่าถ้าฉันเปลี่ยนข้อความในไฟล์ต้นฉบับมันจะดูน่าเกลียด

ฉันสงสัยว่าตัวแปลง PDF เป็น SVG ที่สะอาดที่สุดคืออะไรหวังว่าจะไม่มีเส้นทางสำหรับพื้นที่ข้อความที่ไม่ต้องการ อย่างที่เราทราบ PDF และ SVG นั้นค่อนข้างคล้ายกันดังนั้นฉันคิดว่ามีตัวแปลงที่ดีอยู่บ้าง


12
'อย่างที่เราทราบกันดีว่า PDF และ SVG นั้นค่อนข้างคล้ายกัน ... ' ?!?!? ในกรณีนี้คุณรู้มากกว่าที่ฉันทำ ...
Kurt Pfeifle

22
มีความคล้ายคลึงกันในแง่ที่เป็นรูปแบบเวกเตอร์ทั้งคู่ นั่นคือจุดสิ้นสุดของการเปรียบเทียบที่ฉันเชื่อ
Frank Rem

1
ฉันคิดว่าทั้งคู่ใช้การวางตำแหน่งข้อความที่แน่นอนมาก
Bryan Field

มีใครทำสิ่งนี้กับ PDF (แบบฟอร์มฟิลด์) แบบโต้ตอบเพื่อให้ยังคงโต้ตอบได้ในเบราว์เซอร์โดยซ้อนทับ INPUT ไว้เหนือ SVG ที่แสดงผลหรือไม่?
ทิม

คำตอบ:


84

หลายคนใช้ Inkscape ใน Wikipedia เพื่อแปลง PDF เป็น SVG

http://inkscape.org/

พวกเขายังมีคำแนะนำที่เป็นประโยชน์ในการทำเช่นนั้น!

http://en.wikipedia.org/wiki/Wikipedia:Graphic_Lab/Resources/PDF_conversion_to_SVG#Conversion_with_Inkscape


4
Inkscape ทำงานได้ไม่ดีนักเนื่องจากจะเปลี่ยนข้อความเป็นเส้นทางด้วย ฉันยังพบว่าพวกเขามักจะสูญเสียข้อมูลแบบอักษร แต่ดูเหมือนจะไม่ได้ประมาณแบบอักษรที่ดีที่ติดตั้งไว้ PDF จะแสดงอย่างไรหาก SVG ไม่สามารถทำได้
DanRedux

นั่นเป็นคำถามที่ยุติธรรมฉันคุ้นเคยกับทั้งสองรูปแบบ แต่ฉันยังไม่ได้ทำการวิจัยในหัวข้อนี้มากนัก ฉันอาจจะดูมัน คิดว่ามันอาจจะเดือดไปถึงวิธีการสร้างทั้งสองรูปแบบ SVG สร้างขึ้นด้วย XML ในขณะที่ PDF ใช้รูปแบบ XML Type ของตัวเอง
Saintt Sheldon Patnett

3
เหตุผลที่ฉันต้องการเป็นเพราะฉันต้องการแก้ไขข้อความโดยใช้ PHP ฉันสามารถทำได้โดยตรงกับ PDF แต่ PDF ไม่สามารถแทรกเข้าไปใน HTML ได้อย่างง่ายดาย แต่ SVG ทำได้ ฉันอาจจะติด PDF และแปลงเป็น JPG ใน PHP หลังจากแก้ไขค่าแล้ว ..
DanRedux

8
@DanRedux: AFAIK คุณสามารถปิดการแปลง'ข้อความแบบอักษรไปยังเส้นทาง'ใน Inkscape บน commandline Inkscape ที่คุณจะช่วยให้--export-text-to-pathการแปลงนี้โดยการเพิ่ม
Kurt Pfeifle

1
อาจเห็นได้ชัด แต่ Illustrator สามารถแปลง PDF เป็น SVG ได้ มาที่นี่ดาวน์โหลด Inkscape จากนั้นก็รู้ว่าฉันมี Illustrator en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
อีซุนดิน

84

คุณสามารถใช้ Inkscape บนบรรทัดคำสั่งเท่านั้นโดยไม่ต้องเปิด GUI ลองสิ่งนี้:

inkscape \
  --without-gui \
  --file=input.pdf \
  --export-plain-svg=output.svg 

สำหรับรายการที่สมบูรณ์ของตัวเลือก commandline inkscape --helpทุกระยะ


สิ่งนี้จะลบช่องว่างในข้อความให้ฉัน
MaxNoe

1
@MaxNoe: เป็นไปได้มากทีเดียว - แต่นี่เป็น "คุณสมบัติ" ของวิธีการสร้าง PDF นั้นภายใน สำหรับคำอธิบายของปัญหาบางอย่างเมื่อมันมาถึงการรับรู้และสารสกัดจาก "ข้อความ" จากไฟล์ PDF, ดูไฟล์ PDF มือรหัสของฉัน (ที่มีความคิดเห็นที่ฝังตัว) ที่ GitHub (เปิดในโปรแกรมแก้ไขข้อความที่คุณเลือกเช่นเดียวกับโปรแกรมดู PDF และ copy'n'paste ข้อความจากไฟล์)
Kurt Pfeifle

ใช่ฉันคิดว่ามันเกี่ยวข้องกับวิธีที่ tex แสดงช่องว่างเป็นกล่อง
MaxNoe

23

ฉันกำลังใช้PDFBoxซึ่งรองรับการแสดงผลกราฟิกได้ดี มีการสนับสนุนที่ดีสำหรับการแยกจังหวะเวกเตอร์และสำหรับการจัดการฟอนต์ มีเครื่องมือที่ดีสำหรับการทดลองใช้งาน (เช่น PDFReader จะแสดงเป็น Java Graphics2D) คุณสามารถสกัดกั้นเครื่องมือกราฟิกด้วยเครื่องมือ SVG เช่นผ้าบาติก (ฉันทำแบบนี้และให้การจับภาพที่ดี)

ไม่มีวิธีง่ายๆในการแปลง PDF ทั้งหมดเป็น SVG - ขึ้นอยู่กับกลยุทธ์และเครื่องมือที่ใช้ในการสร้าง PDF ข้อความบางส่วนถูกแปลงเป็นเวกเตอร์และไม่สามารถสร้างขึ้นใหม่ได้โดยง่าย - คุณต้องติดตั้งฟอนต์เวกเตอร์และค้นหา

อัปเดต: ตอนนี้ฉันได้พัฒนาสิ่งนี้เป็นแพ็คเกจ PDF2SVGซึ่งไม่ได้ใช้ผ้าบาติกอีกต่อไป:

ซึ่งได้รับการทดสอบกับ PDF หลายประเภท สร้างเอาต์พุต SVG ประกอบด้วย

  • อักขระเป็นหนึ่ง<svg:text>ตัวต่ออักขระ
  • เส้นทางเป็น <svg:path>
  • ภาพเป็น <svg:image>

แพคเกจในภายหลังจะ (หวังว่า) จะแปลงอักขระเป็นข้อความที่รันและเส้นทางไปยังวัตถุกราฟิกระดับสูงกว่า

อัปเดต: ตอนนี้เราสามารถสร้างข้อความที่กำลังทำงานขึ้นมาใหม่จากอักขระ SVG ได้แล้ว นอกจากนี้เรายังแปลงไดอะแกรมเป็น XML เฉพาะโดเมน (เช่นเคมีสเปกตรัม) ดูhttps://bitbucket.org/petermr/svg2xml-dev มันยังอยู่ใน Alpha แต่กำลังเคลื่อนที่ด้วยความเร็วที่เป็นประโยชน์ ใคร ๆ ก็เข้าร่วมได้!

UPDATE (@Tim Kelty) เรายังคงทำงานกับ PDF2SVG และเครื่องมือดาวน์สตรีมที่ทำ (จำกัด ) Java OCR และการสร้างกราฟิกระดับสูง (ลูกศรกล่อง ฯลฯ ) ดูhttps://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/normaและhttps://bitbucket.org/petermr/ami-core นี่เป็นโครงการที่ได้รับทุนเพื่อรวบรวมข้อเท็จจริง 100 ล้านรายการจากวรรณกรรมทางวิทยาศาสตร์ (contentmine.org) ซึ่งส่วนใหญ่เป็น PDF


19

หัวข้อนี้ค่อนข้างเก่า แต่นี่เป็นวิธีแก้ปัญหาที่มีประโยชน์ที่ฉันพบ:

http://www.cityinthesky.co.uk/opensource/pdf2svg/

มีเครื่องมือ pdf2png ซึ่งเมื่อติดตั้งแล้วจะทำงานในบรรทัดคำสั่ง ฉันได้ทดสอบกับผลลัพธ์ที่ไม่สามารถแก้ไขได้จนถึงตอนนี้รวมถึงบิตแมปด้วย

แก้ไข: ความผิดพลาดของฉันเครื่องมือนี้ยังแปลงตัวอักษรเป็นเส้นทางดังนั้นจึงไม่สามารถตอบคำถามเริ่มต้นได้ อย่างไรก็ตามมันก็ทำงานได้ดีและสามารถเป็นประโยชน์กับทุกคนที่ไม่ได้ตั้งใจจะแก้ไขโค้ดในไฟล์ svg ดังนั้นฉันจะออกจากโพสต์นี้


บน Ubuntu คุณสามารถติดตั้งได้ด้วย: $ sudo apt-get install pdf2svg
tvw

2
แม้ว่าจะแปลงตัวอักษรเป็นเส้นทาง แต่ผลลัพธ์ก็ยอดเยี่ยม ในการปรับเปลี่ยนบางอย่างฉันเคยแก้ไข SVG โดยตรงด้วยตัวแก้ไข หากคุณเปิดและบันทึกโดยใช้ inkscape เป็น inkscape SVG โค้ดจะดูดีขึ้นและคุณมีรหัสวัตถุเพื่อให้ค้นหาเอนทิตีได้ง่ายคุณก็ต้องการเปลี่ยนแปลง
tvw

1
คุณสามารถติดตั้งบน Mac ด้วยbrew install pdf2svgไฟล์.
Colas

10

นี่คือกระบวนการที่ฉันใช้ เครื่องมือหลักที่ฉันใช้คือ Inkscape ซึ่งสามารถแปลงข้อความได้

  • ใช้การกระทำ Adobe Acrobat Pro กับ JavaScript เพื่อแยกแผ่นงาน PDF
  • จัดอันดับ Inkscape Portable 0.48.5 จาก Windows Cmd เพื่อแปลงเป็น SVG
  • ทำการแก้ไขด้วยตนเองกับแอตทริบิวต์ SVG XML เฉพาะที่ฉันประสบปัญหาโดยใช้ Windows Cmd และ Windows PowerShell

แยกหน้า: Adobe Acrobat Pro พร้อม JavaScript

การใช้ Adobe Acrobat Pro Actions (เดิมคือ Batch Processing) สร้างการดำเนินการแบบกำหนดเองเพื่อแยกหน้า PDF เป็นไฟล์แยกกัน หรือคุณอาจแยกไฟล์ PDF ด้วย GhostScript ได้

Acrobat JavaScript Action เพื่อแบ่งหน้า

/* Extract Pages to Folder */

var re = /.*\/|\.pdf$/ig;
var filename = this.path.replace(re,"");

{
    for ( var i = 0;  i < this.numPages; i++ )
    this.extractPages
     ({
        nStart: i,
        nEnd: i,
        cPath : filename + "_s" + ("000000" + (i+1)).slice (-3) + ".pdf"
    });
};

การแปลง PDF เป็น SVG: Inkscape พร้อมไฟล์แบตช์ Windows CMD

การใช้ Windows Cmd ที่สร้างไฟล์แบตช์เพื่อวนซ้ำไฟล์ PDF ทั้งหมดในโฟลเดอร์และแปลงเป็น SVG

ไฟล์แบทช์เพื่อแปลง PDF เป็น SVG ในโฟลเดอร์ปัจจุบัน

:: ===== SETUP =====
@echo off
CLS
echo Starting SVG conversion...
echo.

:: setup working directory (if different)
REM set "_work_dir=%~dp0"
set "_work_dir=%CD%"

:: setup counter
set "count=1"

:: setup file search and save string
set "_work_x1=pdf"
set "_work_x2=svg"
set "_work_file_str=*.%_work_x1%"

:: setup inkscape commands
set "_inkscape_path=D:\InkscapePortable\App\Inkscape\"
set "_inkscape_cmd=%_inkscape_path%inkscape.exe"

:: ===== FIND FILES IN WORKING DIRECTORY =====
:: Output from DIR last element is single  carriage return character. 
:: Carriage return characters are directly removed after percent expansion, 
:: but not with delayed expansion.

pushd "%_work_dir%"
FOR /f "tokens=*" %%A IN ('DIR /A:-D /O:N /B %_work_file_str%') DO (
    CALL :subroutine "%%A"
)
popd

:: ===== CONVERT PDF TO SVG WITH INKSCAPE =====

:subroutine
echo.
IF NOT [%1]==[] (

    echo %count%:%1
    set /A count+=1

    start "" /D "%_work_dir%" /W "%_inkscape_cmd%" --without-gui --file="%~n1.%_work_x1%" --export-dpi=300 --export-plain-svg="%~n1.%_work_x2%"

) ELSE (
    echo End of output
)
echo.

GOTO :eof

:: ===== INKSCAPE REFERENCE =====

:: print inkscape help
REM "%_inkscape_cmd%" --help > "%~dp0\inkscape_help.txt"
REM "%_inkscape_cmd%" --verb-list > "%~dp0\inkscape_verb_list.txt"

แอตทริบิวต์การล้างข้อมูล: Windows Cmd และ PowerShell

ฉันตระหนักดีว่าไม่ใช่แนวทางปฏิบัติที่ดีที่สุดในการแก้ไขแท็ก SVG หรือ XML หรือแอตทริบิวต์ด้วยตนเองเนื่องจากอาจมีรูปแบบที่แตกต่างกันและควรใช้ตัวแยกวิเคราะห์ XML แทน อย่างไรก็ตามฉันมีปัญหาง่ายๆที่ความกว้างของเส้นขีดในรูปวาดหนึ่งมีขนาดเล็กมากและในอีกกลุ่มแบบอักษรถูกระบุอย่างไม่ถูกต้องดังนั้นฉันจึงแก้ไขสคริปต์แบตช์ Windows Cmd ก่อนหน้าโดยทั่วไปเพื่อทำการค้นหาและแทนที่อย่างง่าย การเปลี่ยนแปลงเพียงอย่างเดียวคือนิยามสตริงการค้นหาและการเปลี่ยนเพื่อเรียกคำสั่ง PowerShell คำสั่ง PowerShell จะดำเนินการค้นหาและแทนที่และบันทึกไฟล์ที่แก้ไขด้วยคำต่อท้ายที่เพิ่มเข้ามา ฉันพบข้อมูลอ้างอิงอื่น ๆ ที่สามารถใช้ในการแยกวิเคราะห์หรือแก้ไขไฟล์ SVG ที่เป็นผลลัพธ์ได้ดีกว่าหากจำเป็นต้องทำการล้างข้อมูลเล็กน้อยอื่น ๆ

การแก้ไขเพื่อค้นหาและแทนที่ข้อมูล SVG XML ด้วยตนเอง

:: setup file search and save string
set "_work_x1=svg"
set "_work_x2=svg"
set "_work_s2=_mod"
set "_work_file_str=*.%_work_x1%"

powershell -Command "(Get-Content '%~n1.%_work_x1%') | ForEach-Object {$_ -replace 'stroke-width:0.06', 'stroke-width:1'} | ForEach-Object {$_ -replace 'font-family:Times Roman','font-family:Times New Roman'} | Set-Content '%~n1%_work_s2%.%_work_x2%'"

หวังว่านี่อาจช่วยใครบางคนได้

อ้างอิง

Adobe Acrobat Pro Actions และ JavaScript อ้างอิงไปยังเพจแยก

การอ้างอิง GhostScript ไปยังหน้าแยก

การอ้างอิงบรรทัดคำสั่ง Inkscape สำหรับการแปลง PDF เป็น SVG

การอ้างอิงสคริปต์ Windows Cmd Batch File

แท็ก XML / การวิจัยการแทนที่แอตทริบิวต์


7

หากเป็นตัวเลือก DVI เป็น SVG คุณยังสามารถใช้dvisvgmเพื่อแปลงไฟล์ DVI เป็นไฟล์ SVG ได้ สิ่งนี้ทำงานได้อย่างสมบูรณ์เช่นสำหรับสูตร LaTeX (พร้อมตัวเลือก--no-fonts):

dvisvgm --no-fonts input.dvi -o output.svg

นอกจากนี้ยังมีpdf2svgซึ่งใช้ poppler และ Cairo เพื่อแปลง pdf เป็น SVG เมื่อฉันลองสิ่งนี้ SVG ก็แสดงผลในรูปแบบinkscape.


1
ฉันมี PDF ที่แสดงสัญลักษณ์ LaTeX จากแพ็คเกจ skak (ตัวหมากรุก) ไฟล์นี้ไม่ได้รับการจัดการอย่างดีใน Inkscape เนื่องจากสัญลักษณ์กลายเป็นตัวอักษร Arial ... ฉันได้ผลลัพธ์ที่ถูกต้องด้วย pdf2svg
LRMAAX

สำหรับระบบที่ใช้ Windows มีชุดเครื่องมือไบนารีรวบรวมที่นี่: Poppler สำหรับ Windows
Paolo Gibellini

7

Bash script เพื่อแปลงแต่ละหน้าของ PDF เป็นไฟล์ SVG ของตัวเอง

#!/bin/bash
#
#  Make one PDF per page using PDF toolkit.
#  Convert this PDF to SVG using inkscape
#

inputPdf=$1

pageCnt=$(pdftk $inputPdf dump_data | grep NumberOfPages | cut -d " " -f 2)

for i in $(seq 1 $pageCnt); do
    echo "converting page $i..."
    pdftk ${inputPdf} cat $i output ${inputPdf%%.*}_${i}.pdf
    inkscape --without-gui "--file=${inputPdf%%.*}_${i}.pdf" "--export-plain-svg=${inputPdf%%.*}_${i}.svg"
done

ในการสร้างใน png ให้ใช้--export-pngฯลฯ ...


1

ฉันพบว่าxfigมันทำได้ดีมาก:

pstoedit -f fig foo.pdf foo.fig
xfig foo.fig

export to svg

ทำได้ดีกว่า inkscape มาก จริงๆแล้วมันอาจจะเป็น pdtoedit ที่ทำได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.