2017-12-08 20 views
3

Office Open XML wrapPolygonには、xyという意味と単位が分かりますか?OfficeオープンXMLの `x`と` y`の意味と単位 `wrapPolygon`

documentation状態:

「は、X軸上の座標を指定し、このための原点は親XML要素によって指定されなければならない座標...この属性の可能な値がで定義されています。 ST_Coordinateシンプルタイプ(§5.1.12.16)。 "

画像の左上の点で、x = 0で始まり、y = 0で始まるポリゴンを記述する必要があるようです。単位はEMUとなります。

しかし、これは本当のことはできませんコードChange image layout or wrap in DOCX with Apache POIに使用されている場合ので、私のようなものを行う場合には、その後、:

... 
    +"<wp:wrapTight wrapText=\"bothSides\">" 
    +"<wp:wrapPolygon edited=\"0\">" 
    +"<wp:start x=\"0\" y=\"0\"/>" 
    +"<wp:lineTo x=\"0\" y=\""+height+"\"/>" 
    +"<wp:lineTo x=\""+width+"\" y=\""+height+"\"/>" 
    +"<wp:lineTo x=\""+width+"\" y=\"0\"/>" 
    +"<wp:lineTo x=\"0\" y=\"0\"/>" 
    +"</wp:wrapPolygon>" 
    +"</wp:wrapTight>" 
... 

をその結果のラップポイントは絵の外にずっと遠く離れています。

代わり四角形ポリゴンを記述する21600 X 21600

... 
    +"<wp:wrapPolygon edited=\"0\">" 
    +"<wp:start x=\"0\" y=\"0\"/>" 
    +"<wp:lineTo x=\"0\" y=\"21600\"/>" 
    +"<wp:lineTo x=\"21600\" y=\"21600\"/>" 
    +"<wp:lineTo x=\"21600\" y=\"0\"/>" 
    +"<wp:lineTo x=\"0\" y=\"0\"/>" 
    +"</wp:wrapPolygon>" 
... 

画像の完全幅×高さにある点をラップにつながります。

enter image description here

そして、これは絵の大きさ自体は無関係です。すべての可能なサイズの正方形または長方形のサイズの画像である可能性があります。

だから "この座標の原点は、親のXML要素で指定されます"。ポリゴンは画像の左上の点でx = 0とy = 0で始まり、幅と高さはEMUになりません。そして、正方形のポリゴン21600 x 21600は、画像が長方形の場合は長方形の折り返し点につながるため、ポリゴン自体の意味さえも明確ではありません。

これはどこかに記載されていますか?

答えて

1

まあ、誰も答えません。だから私は少なくとも、このルールが "正方形のポリゴン21600 x 21600の場合、画像の大きさに依存せず完全な幅x高さの折り返し点につながります"という例を提供します。有用かもしれない。

より複雑なラップポイントを設定する必要がある場合は、たとえば、楕円形を使用すると、画像のサイズに関係なく、この楕円を正方形21600 x 21600に描画するだけです。これは実際の画像サイズに応じてラップポイントを計算するよりはるかに簡単です。だから我々は実際に画像の周りにテキストをきつく入れてWordを強制することができます。

コード例:

import java.io.FileOutputStream; 
import java.io.FileInputStream; 
import java.io.InputStream; 

import org.apache.poi.xwpf.usermodel.*; 

import org.apache.poi.util.Units; 

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing; 
import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject; 
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor; 

public class WordPicturesWrapTight { 

private static CTAnchor getAnchorWithGraphic(CTGraphicalObject graphicalobject, 
               String drawingDescr, int width, int height, 
               int left, int top) throws Exception { 

    String anchorXML = 
    "<wp:anchor xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " 
    +"simplePos=\"0\" relativeHeight=\"0\" behindDoc=\"1\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">" 
    +"<wp:simplePos x=\"0\" y=\"0\"/>" 
    +"<wp:positionH relativeFrom=\"column\"><wp:posOffset>"+left+"</wp:posOffset></wp:positionH>" 
    +"<wp:positionV relativeFrom=\"paragraph\"><wp:posOffset>"+top+"</wp:posOffset></wp:positionV>" 
    +"<wp:extent cx=\""+width+"\" cy=\""+height+"\"/>" 
    +"<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/>" 
    +"<wp:wrapTight wrapText=\"bothSides\">" 
    +"<wp:wrapPolygon edited=\"1\">"; //Set edited 1, so Word will not destroying the wrap points. 

    //A square polygon 21600 x 21600 leads to wrap points in fully width x height independent of picture size. 
    //So if the need is setting more complex wrap points, a ellipse for example, only depicting this ellipse 
    //to a square 21600 x 21600 is needed independent of picture size. 

    long[] x = new long[5]; 
    long[] y = new long[5]; 
    for (int i = 0; i < 5; i++) { 
    x[i] = i * 2700L; //2700 = 21600/2/4 
    y[i] = Math.round(Math.sqrt(116640000d - Math.pow(i * 2700d, 2d))); //116640000 = (21600/2)^2 
    } 

    anchorXML += "<wp:start x=\""+(x[0]+10800)+"\" y=\""+(10800-y[0])+"\"/>"; 

    for (int i = 1; i < 5; i++) { 
    anchorXML += "<wp:lineTo x=\""+(x[i]+10800)+"\" y=\""+(10800-y[i])+"\"/>"; 
    } 
    for (int i = 3; i > -1; i--) { 
    anchorXML += "<wp:lineTo x=\""+(x[i]+10800)+"\" y=\""+(10800+y[i])+"\"/>"; 
    } 
    for (int i = 1; i < 5; i++) { 
    anchorXML += "<wp:lineTo x=\""+(10800-x[i])+"\" y=\""+(10800+y[i])+"\"/>"; 
    } 
    for (int i = 3; i > -1; i--) { 
    anchorXML += "<wp:lineTo x=\""+(10800-x[i])+"\" y=\""+(10800-y[i])+"\"/>"; 
    } 

    anchorXML += "</wp:wrapPolygon>" 
    +"</wp:wrapTight>" 
    +"<wp:docPr id=\"1\" name=\"Drawing 0\" descr=\""+drawingDescr+"\"/><wp:cNvGraphicFramePr/>" 
    +"</wp:anchor>"; 

    CTDrawing drawing = CTDrawing.Factory.parse(anchorXML); 
    CTAnchor anchor = drawing.getAnchorArray(0); 
    anchor.setGraphic(graphicalobject); 
    return anchor; 
} 

public static void main(String[] args) throws Exception { 

    XWPFDocument document = new XWPFDocument(); 

    XWPFParagraph paragraph = document.createParagraph(); 
    XWPFRun run = paragraph.createRun(); 

    InputStream in = new FileInputStream("ellipticSample.png"); 
    run.addPicture(in, Document.PICTURE_TYPE_PNG, "ellipticSample.png", Units.toEMU(100), Units.toEMU(60)); 
    in.close(); 
    CTDrawing drawing = run.getCTR().getDrawingArray(0); 
    CTGraphicalObject graphicalobject = drawing.getInlineArray(0).getGraphic(); 
    CTAnchor anchor = getAnchorWithGraphic(graphicalobject, "ellipticSample.png", 
             Units.toEMU(100), Units.toEMU(60), 
             Units.toEMU(100), Units.toEMU(16)); 
    drawing.setAnchorArray(new CTAnchor[]{anchor}); 
    drawing.removeInline(0); 

    run = paragraph.createRun(); 
    run.setText("The picture is anchored wrap tight. This means text will wrap this according to a polygon described by wrap points. Seems a square polygon 21600 x 21600 leads to wrap points in fully width x height independent of picture size. So if the need is setting more complex wrap points, a ellipse for example, only depicting this ellipse to a square 21600 x 21600 is needed independent of the picture size. This is much more simple if more complex wrap points shall be set. But it's a shame, that this feature not seems documented. So can we rely on it or not?"); 

    document.write(new FileOutputStream("WordPicturesWrapTight.docx")); 
    document.close(); 
} 
} 

結果:

enter image description here

関連する問題