我编写了一个工具AMIPageDrawer
(http://github.com/petermr/ami3),通过将PageDrawer
工具包的PDFBox
类子类化,从PDF提取字符,路径和图像。然后将这些原语用于创建语义SVG(即具有显式字符)。它几乎是完整的(即,路径坐标似乎是正确的),但是fill
(Java不描边的颜色)和stroke
(Java描边颜色)没有正确提取。这个问题仅适用于path
s(不是文本-稍后可能会出现!)。 (AMI
是一个开放源代码框架,用于从文档中提取多种类型的语义,并基于pdf2svg
取代了我的PDFBox1
)。
对于这个问题,我深表歉意,但是关于将PDF提取到SVG的开源代码很少。
在https://github.com/petermr/ami3/tree/master/src/test/resources/org/contentmine/ami/pdf2svg2.so中给出了输入PDF,PageDrawer输出(png
)和AMIPageDrawer输出(svg
)。
其中包含PDFBox2中的custom-render-demo
。 png
是通过调用super
的{{1}}方法创建的,并且看起来基本上是相同的,因此可以正确地进行调用。同时,我提取了图形调用(PageDrawer
,moveTo
等,并捕获了lineTo
中的语义(我的pathPrimitiveList
{{1 }}属性,除了SVG
<path d>
和CSS
属性外,我相信它可以正常工作,尤其是前两个“圆”应该有fill
,最后一个应该有stroke
。我相信正确提取了坐标(这是我们需要的数据)。
(注意。此版本的fill="none"
忽略了stroke="none"
,因为是否可以提取语义存在疑问。还忽略了“ Hello World”中未旋转的字符。)
注意:如果有一个现有的Open示例如何提取语义,我会很高兴。否则,这是少数几个实际提取坐标,图元和属性的开放系统之一。子类化AMI
而不是clip
的吸引力在于,已经应用了转换,并且在语义上与SVG非常接近。
我在下面复制了用于提取路径的关键部分。共有三个交互框架:
PageDrawer
使用的PDStreamEngine
。这保持“填充”和“笔划”(CSS术语)的状态。我假设这对应于PDGraphics
和PageDrawer
。NonStrokingColor
,StrokingColor
用于创建JavaAWT
,其状态用PageDrawer
表示。 png
,结果将以Graphics2D
SVG/CSS
的形式出现,它明确支持SVG
和<path>
属性或在fill
中。 我的问题是知道何时以及如何从stroke
流中提取CSS-style
,fill
和stroke
属性。
我假设构建stroke-width
后应该在PageDrawer
和path
中“输出”,因为我假设这就是调用linePath
图形的地方。>
我注意到strokePath
和AWT
都在不同的时间使用,但fillPath
没有使用(在此示例中)。
辅助方法和输出如下。
strokePath
控制台输出为
fillAndStrokePath