You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

XSSFSignatureLine.java 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package org.apache.poi.xssf.usermodel;
  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4. import javax.xml.namespace.QName;
  5. import com.microsoft.schemas.office.excel.CTClientData;
  6. import com.microsoft.schemas.office.excel.STCF;
  7. import com.microsoft.schemas.office.excel.STObjectType;
  8. import com.microsoft.schemas.office.excel.STTrueFalseBlank;
  9. import com.microsoft.schemas.office.office.CTSignatureLine;
  10. import com.microsoft.schemas.vml.CTImageData;
  11. import com.microsoft.schemas.vml.CTShape;
  12. import org.apache.poi.common.usermodel.PictureType;
  13. import org.apache.poi.ooxml.POIXMLDocumentPart;
  14. import org.apache.poi.ooxml.POIXMLException;
  15. import org.apache.poi.ooxml.POIXMLRelation;
  16. import org.apache.poi.ooxml.util.XPathHelper;
  17. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  18. import org.apache.poi.poifs.crypt.dsig.SignatureLine;
  19. import org.apache.poi.schemas.vmldrawing.CTXML;
  20. import org.apache.xmlbeans.XmlException;
  21. public class XSSFSignatureLine extends SignatureLine {
  22. private static final String MS_VML_URN = "urn:schemas-microsoft-com:vml";
  23. public void parse(XSSFSheet sheet) throws XmlException {
  24. XSSFVMLDrawing vml = sheet.getVMLDrawing(false);
  25. if (vml == null) {
  26. return;
  27. }
  28. CTSignatureLine line = XPathHelper.selectProperty(vml.getDocument(), CTSignatureLine.class, null,
  29. new QName[]{XSSFVMLDrawing.QNAME_VMLDRAWING},
  30. new QName[]{new QName(MS_VML_URN, "shape")},
  31. new QName[]{QNAME_SIGNATURE_LINE});
  32. if (line != null) {
  33. setSignatureShape(line);
  34. parse();
  35. }
  36. }
  37. public void add(XSSFSheet sheet, XSSFClientAnchor anchor) {
  38. XSSFVMLDrawing vml = sheet.getVMLDrawing(true);
  39. CTXML root = vml.getDocument().getXml();
  40. add(root, (image, type) -> addPicture(image,type,sheet));
  41. CTShape shape = getSignatureShape();
  42. CTClientData clientData = shape.addNewClientData();
  43. // LeftColumn, LeftOffset, TopRow, TopOffset, RightColumn, RightOffset, BottomRow, BottomOffset
  44. String anchorStr =
  45. anchor.getCol1()+", "+
  46. anchor.getDx1()+", "+
  47. anchor.getRow1()+", "+
  48. anchor.getDy1()+", "+
  49. anchor.getCol2()+", "+
  50. anchor.getDx2()+", "+
  51. anchor.getRow2()+", "+
  52. anchor.getDy2();
  53. // anchorStr = "2, 0, 3, 0, 5, 136, 9, 32";
  54. clientData.addAnchor(anchorStr);
  55. clientData.setObjectType(STObjectType.PICT);
  56. clientData.addSizeWithCells(STTrueFalseBlank.X);
  57. clientData.addCF(STCF.PICT);
  58. clientData.addAutoPict(STTrueFalseBlank.X);
  59. }
  60. @Override
  61. protected void setRelationId(CTImageData imageData, String relId) {
  62. imageData.setRelid(relId);
  63. }
  64. private String addPicture(byte[] image, PictureType type, XSSFSheet sheet) throws InvalidFormatException {
  65. XSSFWorkbook wb = sheet.getWorkbook();
  66. XSSFVMLDrawing vml = sheet.getVMLDrawing(false);
  67. POIXMLRelation xtype = mapType(type);
  68. int idx = wb.getNextPartNumber(xtype, -1);
  69. POIXMLDocumentPart.RelationPart rp = vml.createRelationship(xtype, XSSFFactory.getInstance(), idx, false);
  70. POIXMLDocumentPart dp = rp.getDocumentPart();
  71. try (OutputStream out = dp.getPackagePart().getOutputStream()) {
  72. out.write(image);
  73. } catch (IOException e) {
  74. throw new POIXMLException(e);
  75. }
  76. return rp.getRelationship().getId();
  77. }
  78. private static POIXMLRelation mapType(PictureType type) throws InvalidFormatException {
  79. switch (type) {
  80. case BMP:
  81. return XSSFRelation.IMAGE_BMP;
  82. case DIB:
  83. return XSSFRelation.IMAGE_DIB;
  84. case EMF:
  85. return XSSFRelation.IMAGE_EMF;
  86. case EPS:
  87. return XSSFRelation.IMAGE_EPS;
  88. case GIF:
  89. return XSSFRelation.IMAGE_GIF;
  90. case JPEG:
  91. return XSSFRelation.IMAGE_JPEG;
  92. case PICT:
  93. return XSSFRelation.IMAGE_PICT;
  94. case PNG:
  95. return XSSFRelation.IMAGE_PNG;
  96. case TIFF:
  97. return XSSFRelation.IMAGE_TIFF;
  98. case WMF:
  99. return XSSFRelation.IMAGE_WMF;
  100. case WPG:
  101. return XSSFRelation.IMAGE_WPG;
  102. default:
  103. throw new InvalidFormatException("Unsupported picture format "+type);
  104. }
  105. }
  106. }