java - 如何使用apache poi获取子图形的绝对位置

标签 java apache-poi openxml shapes

这是一个带有子形状的 groupShape:

<p:nvgrpsppr> 
   <p:cnvpr name="Group 256" id="260" /> 
   <p:cnvgrpsppr> 
    <a:grpsplocks nochangeaspect="1" /> 
   </p:cnvgrpsppr> 
   <p:nvpr /> 
  </p:nvgrpsppr> 
  <p:grpsppr bwmode="auto"> 
   <a:xfrm> 
    <a:off y="1940518" x="2952779" /> 
    <a:ext cy="2209679" cx="1219680" /> 
    <a:choff y="1052" x="1972" /> 
    <a:chext cy="1116" cx="616" /> 
   </a:xfrm> 
   <a:solidfill> 
    <a:srgbclr val="F7B63E" /> 
   </a:solidfill> 
  </p:grpsppr> 
  <p:sp> 
   <p:nvsppr> 
    <p:cnvpr name="Freeform 257" id="262" /> 
    <p:cnvsppr> 
     <a:splocks noeditpoints="1" /> 
    </p:cnvsppr> 
    <p:nvpr /> 
   </p:nvsppr> 
   <p:sppr bwmode="auto"> 
    <a:xfrm> 
     <a:off y="1160" x="2161" /> 
     <a:ext cy="287" cx="288" /> 
    </a:xfrm>
   </p:sppr>
  </p:sp>

当我取消分组时,得到这个:

  <p:grpsppr> 
   <a:xfrm> 
    <a:off y="0" x="0" /> 
    <a:ext cy="0" cx="0" /> 
    <a:choff y="0" x="0" /> 
    <a:chext cy="0" cx="0" /> 
   </a:xfrm> 
  </p:grpsppr> 
  <p:sp> 
   <p:nvsppr> 
    <p:cnvpr name="Freeform 257" id="262" /> 
    <p:cnvsppr> 
     <a:splocks noeditpoints="1" /> 
    </p:cnvsppr> 
    <p:nvpr /> 
   </p:nvsppr> 
   <p:sppr bwmode="auto"> 
    <a:xfrm> 
     <a:off y="2154358" x="3326999" /> 
     <a:ext cy="568260" cx="570240" /> 
    </a:xfrm>
   </p:sppr>
  </p:sp>

转换为绝对定位的childShape。

<a:xfrm> 
 <a:off y="1160" x="2161" /> 
 <a:ext cy="287" cx="288" /> 
</a:xfrm>

converted to:

<a:xfrm> 
 <a:off y="2154358" x="3326999" /> 
 <a:ext cy="568260" cx="570240" /> 
</a:xfrm>

我是通过计算算出长宽的。

width = (group a:ext:cx)/(group a:chExt:cx) * (child a:ext:x>);

高度=(组a:ext:cy)/(组a:chExt:cy)*( child a:ext:y);

但是我试了很多种操作,都不知道怎么转换x坐标和y坐标。

y:1160 到 y:2154358 需要传递什么操作

请给我一些建议。

最佳答案

在你的组 XML

<a:off y="1940518" x="2952779" /> 
<a:ext cy="2209679" cx="1219680" /> 

表示:该组从 y 1940518、x 2952779 开始,高度为 2209679,宽度为 1219680。

<a:choff y="1052" x="1972" /> 
<a:chext cy="1116" cx="616" /> 

表示:该组的子部分从 y 1052、x 1972 开始,高度为 1116,宽度为 616。这是形状的原始值分组时。

这表明您的组形状已严重缩放。它很小,然后用 1980 倍缩放。

scale_factor_y = ext_cy / chext_cy 
               = 2209679 / 1116 
               ≈ 1980

scale_factor_x = ext_cx / chext_cx 
               = 1219680 / 616
               = 1980

给小组中的 child

 <a:off y="1160" x="2161" /> 
 <a:ext cy="287" cx="288" /> 

表示:未缩放的偏移量是y 1160,x 2161。未缩放的范围是高287,宽288。

如果未分组,缩放后的偏移量为:

off_y = (not_scaled_off_y - choff_y) * scale_factor_y + group_off_y
      = (1160  - 1052) * 1980 + 1940518
      = 2154358

off_x = (not_scaled_off_x - choff_x) * scale_factor_x + group_off_x
      = (2161  - 1972) * 1980 + 2952779
      = 3326999

缩放范围是:

ext_cy = not_scaled_ext_cy * scale_factor_y
       = 287 * 1980
       = 568260

ext_cx = not_scaled_ext_cx * scale_factor_x
       = 288 * 1980
       = 570240

这导致你的

<a:off y="2154358" x="3326999" /> 
<a:ext cy="568260" cx="570240" /> 

对于组外的 child ,现在与组之前的比例大小相同。

关于java - 如何使用apache poi获取子图形的绝对位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60770606/

相关文章:

java - Android JSON 解析 : parse a particular element

java - Spring Data JPA 如何为实现公共(public)接口(interface)的两个域类创建单个存储库?

java - 将 synchronized() 与 ReentrantLock.lock() 混合使用

java - 上传word文档

java - 使用 Apache Poi 读取内部存储中的 excel xlsx 文件

c# - 如何使用 OpenXML 从 Excel 工作表中检索选项卡名称

openxml - 使用 Open XML 的表格单元格边距

java - XMLCatalog 可以用于模式导入吗?

tsql - 如何在 SQL Server 中的用户定义函数中使用 openxml

java - 如何使用 Apache POI 将图片大小调整为段落大小?