将PDF转换为清洁SVG?

Convert PDF to clean SVG?

我正在尝试将PDF转换为SVG。但是,我现在使用的这个工具为每一段文本中的每一个字母映射了一个路径,这意味着如果我更改其源文件中的文本,它看起来很难看。

我想知道最干净的PDF-to-SVG转换器是什么,希望它没有一个简单的不需要的文本区域的路径。正如我们所知,PDF和SVG非常相似,所以我假设有一些很好的转换器。


维基百科上的许多人使用Inkscape将PDF转换成SVG。

http://inkscape.org网站/

他们甚至有一个方便的指导如何做到这一点!

http://en.wikipedia.org/wiki/wikipedia:graphic_lab/resources/pdf_conversion_to_svg conversion_with_inkscape


您只能在命令行上使用inkscape,而不需要打开GUI。试试这个:

1
2
3
4
inkscape \
  --without-gui \
  --file=input.pdf \
  --export-plain-svg=output.svg

要获得所有命令行选项的完整列表,请运行inkscape --help


我目前正在使用PDFBox,它对图形输出有很好的支持。对于提取矢量笔画和管理字体有很好的支持。有一些很好的尝试工具(例如PDFRADADER将显示为Java图形2D)。您可以使用类似batik的SVG工具截取图形工具(i do this and it gives good capture).

没有简单的方法可以将所有PDF转换为SVG—这取决于用于创建PDF的策略和工具。有些文本被转换为矢量,无法轻松重建-您必须安装矢量字体并查找它们。

更新:我现在已经将其开发成一个不再使用batik的包pdf2svg:

已经在一系列PDF上进行了测试。它产生SVG输出,包括

  • 每个字符一个字符
  • 路径为
  • 图像如

later packages will(hoped)convert the characters to running text and the path to higher-level graphics objects(希望以后的软件包将字符转换为运行文本,并将路径转换为更高级别的图形对象)

更新:我们现在可以从SVG字符重新创建运行文本。我们还将图表转换为特定于领域的XML(例如,化学光谱)。请参阅https://bitback.org/petermr/svg2xml-dev。它仍在alpha中,但正在以一个有用的速度移动。任何人都可以加入!

更新。(@提姆KelTy)我们继续研究PDF2SVG和下游工具(做有限的)Java OCR和创建更高级别的图形原语(箭头、盒等)。参见HTTPS://ButkKe.Org/PtErr/IMAGE分析HTTPS://ButkKe.Org/PeTrMR/DigaRAMial4HTPS://BITBUKET.OR/PTEMR/NORMA和HTTPS://BITBUKET.OR/PETMR/AMI-内核。这是一个资助的项目,从科学文献(contentmine.org)中获取1亿个事实,其中大部分是pdf格式的。


这个主题很古老,但我发现了一个方便的解决方案:

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

它提供了一个工具pdf2png,一旦安装它,它就可以在命令行中执行该任务。到目前为止,我已经用无可争议的结果对它进行了测试,包括使用位图。

编辑:我错了,这个工具还将字母转换为路径,所以它不处理初始问题。不过,它还是做得很好,对任何不想修改SVG文件中代码的人都有用,所以我将离开本文。


下面是我最终使用的过程。我使用的主要工具是Inkscape,它可以很好地转换文本。

  • 使用带javascript的Adobe Acrobat Pro操作拆分PDF工作表
  • 从windows cmd运行inkscape portable 0.48.5转换为svg
  • 通过使用Windows命令和Windows PowerShell对我遇到问题的特定SVG XML属性进行了一些手动编辑。

单独页面:带javascript的Adobe Acrobat Pro

使用AdobeAcrobat Pro操作(以前称为批处理)创建一个自定义操作,将PDF页面分隔成单独的文件。或者,您可以使用ghostscript拆分PDF

Acrobat JavaScript拆分页面操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 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转换:带Windows命令批处理文件的Inkscape

使用windows cmd创建的批处理文件循环浏览文件夹中的所有PDF文件并将其转换为SVG

在当前文件夹中将PDF转换为SVG的批处理文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
:: ===== 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数据

1
2
3
4
5
:: 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操作和对单独页面的javascript引用

  • 如何自动从PDF提取页面…
  • Acrobat API参考的javascript-提取页面
  • 提取页面以分离PDF(循环有问题吗?)
  • 如何使用javascript创建零填充值?
  • 如何在javascript中输出前导零整数

Ghostscript引用到单独的页面

  • ghostscript noob帮助-破坏多页PDF文件…
  • 如何转换多页PDF文件…
  • 使用ghostscript拆分PDF

用于PDF到SVG转换的inkscape命令行引用

  • 将PDF转换为SVG
  • 将PDF转换为Clean SVG?

Windows命令批处理文件脚本引用

  • Windows批处理文件的隐藏功能
  • ss64.com-windows命令行的索引
  • 为什么此批处理脚本中的for/f循环评估空白行?

XML标记/属性替换研究

  • 如何使用Windows命令行环境查找和替换文件中的文本?
  • 使用Windows批处理文件更改XML文件中的标记数据
  • 从命令行[Windows]更新XML
  • 如何使用PowerShell修改/创建XML文件中的值?
  • 使用PowerShell编辑XML属性
  • PowerShell更改XML元素属性的值

bash脚本将PDF的每个页面转换为自己的SVG文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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等…


如果可以选择DVI到SVG,也可以使用DVISVGM将DVI文件转换为SVG文件。这一点非常适用于乳胶配方奶粉(带有选项--no-fonts):

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

还有pdf2svg,它使用poppler和cairo将pdf转换为svg。当我尝试这个的时候,SVG在inkscape中被完美地呈现出来。


我发现江户十一〔六〕干得很好:

1
2
3
4
pstoedit -f fig foo.pdf foo.fig
xfig foo.fig

export to svg

它比Inkscape做得更好。事实上,这可能是由pdtoedit做的。


下面是两个PDF呈现脚本的nodejs rest API。https://github.com/pumppi/pdf2图片

脚本是:pdf2svg和imagemagicks convert