2017-12-08 5 views
3

Office Open XML wrapPolygonxy의 의미와 단위가 무엇인지 알고 있습니까?Office Open XML에서`x`와`y`의 의미와 단위`wrapPolygon`

documentation 상태 :

은 "A가 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>" 
... 

는 결과 랩 포인트는 훨씬 멀리 사진 밖에.

대신 X

... 
    +"<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>" 
... 

21600 사진의 완전 너비 X 높이에있는 점을 감싸는 유도 사각형 다각형을 21600을 설명.

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

관련 문제