Chuyển đổi PDF sang SVG sạch? [đóng cửa]


114

Tôi đang cố chuyển đổi PDF sang SVG. Tuy nhiên, cái mà tôi đang sử dụng hiện lập bản đồ đường dẫn cho mọi chữ cái trong mỗi đoạn văn bản, có nghĩa là nếu tôi thay đổi văn bản trong tệp nguồn của nó, nó trông rất xấu.

Tôi đã tự hỏi công cụ chuyển đổi PDF sang SVG sạch nhất là gì, hy vọng một công cụ không có đường dẫn cho các vùng văn bản đơn giản là không cần. Như chúng ta đã biết, PDF và SVG khá giống nhau, vì vậy tôi cho rằng có một số trình chuyển đổi tốt trên mạng.


11
'Như chúng ta đã biết, PDF và SVG khá giống nhau ...' ?!?!? Trong trường hợp đó, bạn biết nhiều hơn những gì tôi làm ...
Kurt Pfeifle

22
Chúng giống nhau theo nghĩa là chúng đều là định dạng dựa trên vectơ. Tôi tin rằng đó là nơi kết thúc so sánh.
Frank Rem

1
Tôi cho rằng cả hai đều sử dụng rất nhiều vị trí tuyệt đối của văn bản.
Bryan Field

Có ai đang làm điều này với các tệp PDF tương tác (trường biểu mẫu) để chúng vẫn tương tác trong trình duyệt, chồng các INPUT lên trên SVG được hiển thị không?
Tim

Câu trả lời:


84

Inkscape được nhiều người sử dụng trên Wikipedia để chuyển đổi PDF sang SVG.

http://inkscape.org/

Họ thậm chí còn có một hướng dẫn hữu ích về cách làm như vậy!

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


4
Inkscape không hoạt động quá tốt, vì nó cũng thay đổi văn bản thành các đường dẫn. Tôi cũng thấy rằng chúng thường làm mất dữ liệu phông chữ, nhưng dường như không gần đúng với một phông chữ tốt, được cài đặt. Làm thế nào để PDF hiển thị nó nếu SVG không thể?
DanRedux

Đó là một câu hỏi công bằng, tôi đã quen thuộc với cả hai định dạng nhưng tôi chưa thực hiện nhiều nghiên cứu về chủ đề này. Tôi có thể có một cái nhìn vào nó. Nó nghĩ rằng nó có thể giảm dần theo cách mà hai định dạng được xây dựng. SVG chẳng hạn được xây dựng bằng XML trong khi PDF sử dụng định dạng Loại XML riêng của nó.
Saintt Sheldon Patnett

3
Lý do tôi muốn điều này là vì tôi muốn có thể chỉnh sửa văn bản bằng PHP. Tôi có thể làm điều đó trực tiếp với PDF, nhưng PDF không thể dễ dàng được chuyển sang HTML, nhưng SVG thì có thể. Tôi chỉ có thể gắn bó với PDF và chuyển nó sang JPG trong PHP sau khi chỉnh sửa giá trị của nó ..
DanRedux

8
@DanRedux: AFAIK, bạn có thể tắt chuyển đổi 'văn bản phông chữ thành đường dẫn' trong Inkscape. Trên dòng lệnh Inkscape, bạn sẽ kích hoạt chuyển đổi này bằng cách thêm --export-text-to-path.
Kurt Pfeifle

1
Nó có thể hiển nhiên nhưng Illustrator có thể chuyển đổi PDF sang SVG. Đến đây, tải xuống Inkscape sau đó nhận ra tôi đã có Illustrator. vi.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
E. Sundin

83

Bạn chỉ có thể sử dụng Inkscape trên dòng lệnh mà không cần mở GUI. Thử cái này:

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

Để có danh sách đầy đủ tất cả các tùy chọn dòng lệnh, hãy chạy inkscape --help.


Điều này loại bỏ không gian trong văn bản cho tôi.
MaxNoe

1
@MaxNoe: Điều đó hoàn toàn có thể xảy ra - nhưng đây là "thuộc tính" của cách mà tệp PDF cụ thể đó được xây dựng trong nội bộ. Để biết một số giải thích về những khó khăn khi nhận dạng và trích xuất "văn bản" từ các tệp PDF, hãy xem các tệp PDF được mã hóa bằng tay của tôi (với các nhận xét được nhúng) tại GitHub . (Mở chúng trong một trình soạn thảo văn bản của sự lựa chọn của bạn cũng như một trình xem PDF và copy'n'paste văn bản từ các tập tin.)
Kurt Pfeifle

Vâng, tôi nghĩ nó liên quan đến cách tex hiển thị khoảng trắng, dưới dạng các hộp.
MaxNoe

23

Tôi hiện đang sử dụng PDFBox có hỗ trợ tốt cho đầu ra đồ họa. Có hỗ trợ tốt cho việc trích xuất các nét vector và cũng để quản lý phông chữ. Có một số công cụ tốt để dùng thử (ví dụ: PDFReader sẽ hiển thị dưới dạng Java Graphics2D). Bạn có thể chặn công cụ đồ họa bằng một công cụ SVG như Batik (tôi làm điều này và nó cho khả năng chụp tốt).

Không có cách đơn giản nào để chuyển đổi tất cả PDF sang SVG - nó phụ thuộc vào chiến lược và công cụ được sử dụng để tạo các tệp PDF. Một số văn bản được chuyển đổi thành vectơ và không thể tái tạo lại dễ dàng - bạn phải cài đặt phông chữ vectơ và tra cứu chúng.

CẬP NHẬT: Bây giờ tôi đã phát triển gói này thành một gói PDF2SVG không sử dụng Batik nữa:

đã được thử nghiệm trên nhiều tệp PDF. Nó tạo ra đầu ra SVG bao gồm

  • các ký tự như một <svg:text>mỗi ký tự
  • đường dẫn như <svg:path>
  • hình ảnh như <svg:image>

Các gói sau này (hy vọng) sẽ chuyển đổi các ký tự thành văn bản đang chạy và đường dẫn đến các đối tượng đồ họa cấp cao hơn

CẬP NHẬT: Bây giờ chúng tôi có thể tạo lại văn bản đang chạy từ các ký tự SVG. Chúng tôi cũng đã chuyển đổi sơ đồ sang XML dành riêng cho miền (ví dụ: quang phổ hóa học). Xem https://bitbucket.org/petermr/svg2xml-dev . Nó vẫn ở dạng Alpha, nhưng đang di chuyển với tốc độ hữu ích. Bất cứ ai cũng có thể tham gia!

CẬP NHẬT. (@Tim Kelty) Chúng tôi đang tiếp tục làm việc trên PDF2SVG và cả các công cụ hạ nguồn thực hiện (có giới hạn) Java OCR và tạo các bản gốc đồ họa cấp cao hơn (mũi tên, hộp, v.v.) Xem https://bitbucket.org/petermr/ phân tích hình ảnh https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/normahttps://bitbucket.org/petermr/ami-core . Đây là một dự án được tài trợ nhằm thu thập 100 triệu dữ kiện từ các tài liệu khoa học (contentmine.org) phần lớn là PDF.


19

Chủ đề này khá cũ, nhưng đây là một giải pháp hữu ích mà tôi đã tìm thấy:

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

Nó cung cấp một công cụ, pdf2png, một công cụ sau khi được cài đặt sẽ thực hiện chính xác công việc trong dòng lệnh. Tôi đã thử nghiệm nó với kết quả không thể sửa chữa cho đến nay, bao gồm cả với bitmap.

CHỈNH SỬA: Sai lầm của tôi, công cụ này cũng chuyển đổi các chữ cái thành đường dẫn, vì vậy nó không giải quyết được câu hỏi ban đầu. Tuy nhiên, dù sao nó cũng hoạt động tốt và có thể hữu ích cho bất kỳ ai không có ý định sửa đổi mã trong tệp svg, vì vậy tôi sẽ để lại bài đăng.


Trên Ubuntu bạn có thể cài đặt nó với: $ sudo apt-get install pdf2svg
tvw

2
Mặc dù nó chuyển đổi các chữ cái thành đường dẫn, nhưng kết quả vẫn tuyệt vời. Để thực hiện một số sửa đổi, tôi đã sử dụng để chỉnh sửa SVG trực tiếp bằng một trình chỉnh sửa. Nếu bạn mở và lưu chúng bằng inkscape dưới dạng inkscape SVG, mã sẽ trông đẹp hơn và bạn có id đối tượng, để dễ dàng tìm thấy các thực thể, bạn muốn thay đổi.
tvw

1
Bạn có thể cài đặt nó trên Mac với brew install pdf2svg.
Colas

10

Đây là quá trình mà tôi đã kết thúc bằng cách sử dụng. Công cụ chính mà tôi sử dụng là Inkscape có thể chuyển đổi văn bản.

  • đã sử dụng các hành động của Adobe Acrobat Pro với JavaScript để chia nhỏ các trang PDF
  • đã chạy Inkscape Portable 0.48.5 từ Windows Cmd để chuyển đổi sang SVG
  • đã thực hiện một số chỉnh sửa thủ công đối với một thuộc tính SVG XML cụ thể mà tôi đang gặp sự cố khi sử dụng Windows Cmd và Windows PowerShell

Các trang riêng biệt: Adobe Acrobat Pro với JavaScript

Sử dụng Adobe Acrobat Pro Actions (trước đây là Batch Processing) tạo một hành động tùy chỉnh để tách các trang PDF thành các tệp riêng biệt. Ngoài ra, bạn có thể chia nhỏ các tệp PDF bằng GhostScript

Acrobat JavaScript Hành động để chia nhỏ các trang

/* 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"
    });
};

Chuyển đổi PDF sang SVG: Inkscape với tệp hàng loạt CMD của Windows

Sử dụng Windows Cmd đã tạo tệp hàng loạt để lặp qua tất cả các tệp PDF trong một thư mục và chuyển đổi chúng thành SVG

Hàng loạt tệp để chuyển đổi PDF sang SVG trong thư mục hiện tại

:: ===== 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"

Thuộc tính dọn dẹp: Windows Cmd và PowerShell

Tôi nhận thấy không phải là phương pháp hay nhất để chỉnh sửa thủ công các thẻ hoặc thuộc tính SVG hoặc XML do các biến thể tiềm ẩn và thay vào đó nên sử dụng trình phân tích cú pháp XML. Tuy nhiên, tôi đã gặp một vấn đề đơn giản là chiều rộng nét vẽ trên một bản vẽ rất nhỏ và trên một bản vẽ khác, họ phông chữ đang được xác định không chính xác, vì vậy về cơ bản tôi đã sửa đổi tập lệnh lô Cmd trước đó của Windows để thực hiện tìm và thay thế đơn giản. Các thay đổi duy nhất là định nghĩa chuỗi tìm kiếm và thay đổi để gọi lệnh PowerShell. Lệnh PowerShell sẽ thực hiện tìm và thay thế và lưu tệp đã sửa đổi với một hậu tố được thêm vào. Tôi đã tìm thấy một số tham chiếu khác có thể được sử dụng tốt hơn để phân tích cú pháp hoặc sửa đổi các tệp SVG kết quả nếu cần thực hiện một số thao tác dọn dẹp nhỏ khác.

Các sửa đổi để tìm và thay thế dữ liệu SVG XML theo cách thủ công

:: 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%'"

Hy vọng điều này có thể giúp ai đó

Người giới thiệu

Adobe Acrobat Pro Actions và JavaScript tham chiếu đến các trang riêng biệt

Tham chiếu GhostScript đến các Trang riêng biệt

Tham chiếu Dòng lệnh Inkscape cho Chuyển đổi PDF sang SVG

Tham chiếu tập lệnh tệp hàng loạt Windows Cmd

Nghiên cứu thay thế thẻ / thuộc tính XML


7

Nếu DVI thành SVG là một tùy chọn, bạn cũng có thể sử dụng dvisvgm để chuyển đổi tệp DVI thành tệp SVG. Điều này hoạt động hoàn hảo, chẳng hạn đối với các công thức LaTeX (có tùy chọn --no-fonts):

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

Ngoài ra còn có pdf2svg sử dụng poppler và Cairo để chuyển đổi pdf thành SVG. Khi tôi thử điều này, SVG đã được hiển thị hoàn hảo inkscape.


1
Tôi có một tệp PDF hiển thị một số ký hiệu LaTeX từ gói skak (quân cờ). Tệp cụ thể này không được xử lý tốt trong Inkscape, vì các ký hiệu trở thành chữ Arial ... Tôi đã có kết quả chính xác với pdf2svg.
LRMAAX

Đối với hệ thống Windows, có một bộ công cụ nhị phân được biên dịch tại đây: Poppler cho Windows .
Paolo Gibellini

7

Bash script để chuyển đổi từng trang của PDF thành tệp SVG của riêng nó.

#!/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

Để tạo trong png, sử dụng --export-png, v.v.


1

Tôi thấy rằng nó xfigđã làm một công việc xuất sắc:

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

export to svg

Nó đã làm tốt hơn nhiều so với inkscape. Trên thực tế, nó có lẽ là pdtoedit đã làm điều đó.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.