在PDFBox中提取填充和描边属性

时间:2019-12-30 16:41:15

标签: java pdf svg pdfbox

我编写了一个工具AMIPageDrawerhttp://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-demopng是通过调用super的{​​{1}}方法创建的,并且看起来基本上是相同的,因此可以正确地进行调用。同时,我提取了图形调用(PageDrawermoveTo等,并捕获了lineTo中的语义(我的pathPrimitiveList {{1 }}属性,除了SVG <path d>CSS属性外,我相信它可以正常工作,尤其是前两个“圆”应该有fill,最后一个应该有stroke。我相信正确提取了坐标(这是我们需要的数据)。

(注意。此版本的fill="none"忽略了stroke="none",因为是否可以提取语义存在疑问。还忽略了“ Hello World”中未旋转的字符。)

注意:如果有一个现有的Open示例如何提取语义,我会很高兴。否则,这是少数几个实际提取坐标,图元和属性的开放系统之一。子类化AMI而不是clip的吸引力在于,已经应用了转换,并且在语义上与SVG非常接近。

代码在 https://github.com/petermr/ami3/blob/master/src/main/java/org/contentmine/pdf2svg2/AMIPageDrawer.java

我在下面复制了用于提取路径的关键部分。共有三个交互框架:

    PageDrawer使用的
  • PDStreamEngine。这保持“填充”和“笔划”(CSS术语)的状态。我假设这对应于PDGraphicsPageDrawer
  • NonStrokingColorStrokingColor用于创建JavaAWT,其状态用PageDrawer表示。
  • png,结果将以Graphics2D SVG/CSS的形式出现,它明确支持SVG<path>属性或在fill中。

我的问题是知道何时以及如何从stroke流中提取CSS-stylefillstroke属性。 我假设构建stroke-width后应该在PageDrawerpath中“输出”,因为我假设这就是调用linePath图形的地方。

我注意到strokePathAWT都在不同的时间使用,但fillPath没有使用(在此示例中)。

辅助方法和输出如下。

strokePath

控制台输出为

fillAndStrokePath

0 个答案:

没有答案