PageRenderTime 151ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/thirdparties-extension/org.apache.poi.xwpf.converter/src/main/java/org/apache/poi/xwpf/converter/internal/xhtml/OLDXHTMLMapper.java

https://code.google.com/
Java | 500 lines | 84 code | 19 blank | 397 comment | 6 complexity | b4284bd8806df21353de32cbfd49672e MD5 | raw file
  1. /**
  2. * Copyright (C) 2011 Angelo Zerr <angelo.zerr@gmail.com> and Pascal Leclercq <pascal.leclercq@gmail.com>
  3. *
  4. * All rights reserved.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining
  7. * a copy of this software and associated documentation files (the
  8. * "Software"), to deal in the Software without restriction, including
  9. * without limitation the rights to use, copy, modify, merge, publish,
  10. * distribute, sublicense, and/or sell copies of the Software, and to
  11. * permit persons to whom the Software is furnished to do so, subject to
  12. * the following conditions:
  13. *
  14. * The above copyright notice and this permission notice shall be
  15. * included in all copies or substantial portions of the Software.
  16. *
  17. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  19. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  20. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  21. * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  22. * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  23. * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24. */
  25. package org.apache.poi.xwpf.converter.internal.xhtml;
  26. import java.io.IOException;
  27. import java.io.OutputStream;
  28. import java.util.List;
  29. import java.util.logging.Logger;
  30. import org.apache.poi.POIXMLDocumentPart;
  31. import org.apache.poi.xwpf.converter.internal.itext.StyleEngineForIText;
  32. import org.apache.poi.xwpf.usermodel.IBodyElement;
  33. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  34. import org.apache.poi.xwpf.usermodel.XWPFParagraph;
  35. import org.apache.poi.xwpf.usermodel.XWPFPictureData;
  36. import org.apache.poi.xwpf.usermodel.XWPFTable;
  37. import org.apache.xmlbeans.XmlException;
  38. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocDefaults;
  39. import fr.opensagres.xdocreport.xhtml.extension.XHTMLConstants;
  40. import fr.opensagres.xdocreport.xhtml.extension.XHTMLPage;
  41. public class OLDXHTMLMapper
  42. implements XHTMLConstants
  43. {
  44. /**
  45. * Logger for this class
  46. */
  47. private static final Logger LOGGER = Logger.getLogger( StyleEngineForIText.class.getName() );
  48. private CTDocDefaults defaults;
  49. private XWPFDocument document;
  50. private XHTMLPage writer = new XHTMLPage( 1 );
  51. public OLDXHTMLMapper( XWPFDocument document )
  52. {
  53. super();
  54. this.document = document;
  55. try
  56. {
  57. defaults = document.getStyle().getDocDefaults();
  58. }
  59. catch ( XmlException e )
  60. {
  61. LOGGER.severe( e.getMessage() );
  62. }
  63. catch ( IOException e )
  64. {
  65. LOGGER.severe( e.getMessage() );
  66. }
  67. }
  68. /**
  69. * @param blipId
  70. * @return XXX in some case XWPFPicture.getPictureData throw a NullPointerException because the getDocument() of
  71. * It's paragraph is null
  72. */
  73. private XWPFPictureData getPictureData( String blipId )
  74. {
  75. for ( POIXMLDocumentPart part : document.getRelations() )
  76. {
  77. if ( part.getPackageRelationship().getId().equals( blipId ) )
  78. {
  79. return (XWPFPictureData) part;
  80. }
  81. }
  82. return null;
  83. }
  84. /**
  85. * Create a pdf version of the document, using XSL FO.
  86. *
  87. * @param wmlStyles
  88. * @param wmlDocument
  89. * @param os The OutputStream to write the pdf to
  90. */
  91. public void output( OutputStream os )
  92. throws Exception
  93. {
  94. try
  95. {
  96. // body.get
  97. List<IBodyElement> bodyElement = document.getBodyElements();
  98. for ( IBodyElement iBodyElement : bodyElement )
  99. {
  100. visit( iBodyElement );
  101. }
  102. }
  103. catch ( Exception e )
  104. {
  105. e.printStackTrace();
  106. throw new Exception( "iTextissues", e );
  107. }
  108. finally
  109. {
  110. // Flush
  111. writer.save( os );
  112. }
  113. }
  114. private void visit( IBodyElement iBodyElement )
  115. throws Exception
  116. {
  117. if ( iBodyElement instanceof XWPFParagraph )
  118. {
  119. visit( (XWPFParagraph) iBodyElement );
  120. // ((Document)parent).add(pdfParagraph);
  121. }
  122. else if ( iBodyElement instanceof XWPFTable )
  123. {
  124. // TODO : visit((XWPFTable) iBodyElement);
  125. }
  126. // return pdfParagraph;
  127. }
  128. // private void visit(XWPFParagraph p) throws Exception {
  129. //
  130. // StringBuilder inlineStringValues = new StringBuilder();
  131. // int left = p.getIndentationLeft();
  132. // int right = p.getIndentationRight();
  133. // writer.startElementNotEnclosed(P_ELEMENT);
  134. // // ILVs = "puce et numero" ...
  135. //
  136. // if (p.getCTP().getPPr().getNumPr() != null) {
  137. // // TODO:
  138. // // CTDecimalNumber ilv = p.getCTP().getPPr().getNumPr().getIlvl();
  139. // // BigInteger val = ilv.getVal();
  140. // // pdfParagraph = new ListItem();
  141. // // // FIXME : must be improved
  142. // // pdfParagraph.setIndentationLeft(10 + 10 * val.intValue());
  143. //
  144. // } else {
  145. //
  146. // inlineStringValues.append("margin-right: " + dxa2points(right)
  147. // + "pt;");
  148. // inlineStringValues.append("margin-left: " + dxa2points(left)
  149. // + "pt;");
  150. // //
  151. // writer.addAttributeValue("style='margin-left: "+dxa2points(right)+"pt;'",false);
  152. // // pdfParagraph.setIndentationRight(dxa2points(right));
  153. // // pdfParagraph.setIndentationLeft(dxa2points(left));
  154. //
  155. // int firstLineIndent = p.getIndentationFirstLine();
  156. // inlineStringValues.append("text-indent: "
  157. // + dxa2points(firstLineIndent) + "pt;");
  158. // // pdfParagraph.setFirstLineIndent(dxa2points(firstLineIndent));
  159. //
  160. // }
  161. //
  162. // // pdfParagraph.setSpacingBefore(dxa2points(p.getSpacingBefore()));
  163. // // TODO:
  164. // // if (p.getSpacingBefore() >= 0) {
  165. // // pdfParagraph.setSpacingBefore(dxa2points(p.getSpacingBefore()));
  166. // // } else if (defaults != null) {
  167. // // BigInteger begore = defaults.getPPrDefault().getPPr().getSpacing()
  168. // // .getBefore();
  169. // // if (begore != null) {
  170. // // pdfParagraph.setSpacingBefore(dxa2points(begore));
  171. // // }
  172. // //
  173. // // }
  174. // // if (p.getSpacingAfter() >= 0) {
  175. // // pdfParagraph.setSpacingAfter(dxa2points(p.getSpacingAfter()));
  176. // // } else if (defaults != null) {
  177. // // BigInteger after = defaults.getPPrDefault().getPPr().getSpacing()
  178. // // .getAfter();
  179. // // if (after != null) {
  180. // // pdfParagraph.setSpacingAfter(dxa2points(after));
  181. // // }
  182. // //
  183. // // } else {
  184. // // // Words 'default if not set :
  185. // // pdfParagraph.setSpacingAfter(10f);
  186. // // }
  187. //
  188. // // pdfParagraph.setSpacingAfter(10f);
  189. // if (p.getCTP().getPPr() != null) {
  190. // if (p.getCTP().getPPr().getSpacing() != null) {
  191. // // PLQ : why 180 ???
  192. // float leading = (p.getCTP().getPPr().getSpacing().getLine()
  193. // .floatValue() / 240);
  194. // inlineStringValues.append("line-height: " + leading + "pt;");
  195. // // pdfParagraph.setMultipliedLeading(leading);
  196. // // CTHpsMeasure meas = p.getCTP().getPPr().getRPr().getSz();
  197. // // if (meas != null) {
  198. // // // PLQ ??? looks better this way ut I don't know why....
  199. // // System.err.println(meas.getVal());
  200. // // pdfParagraph.setSpacingBefore(meas.getVal().intValue() / 4);
  201. // // }
  202. //
  203. // }
  204. // }
  205. // // TextAlignment vAlignment=p.getVerticalAlignment();
  206. //
  207. // ParagraphAlignment alignment = p.getAlignment();
  208. // switch (alignment) {
  209. // case LEFT:
  210. // inlineStringValues.append("text-align: left;");
  211. // // pdfParagraph.setAlignment(ElementTags.ALIGN_LEFT);
  212. // break;
  213. // case RIGHT:
  214. // inlineStringValues.append("text-align: right;");
  215. // // pdfParagraph.setAlignment(ElementTags.ALIGN_RIGHT);
  216. // break;
  217. //
  218. // case CENTER:
  219. // inlineStringValues.append("text-align: center;");
  220. // // pdfParagraph.setAlignment(ElementTags.ALIGN_CENTER);
  221. // break;
  222. //
  223. // case BOTH:
  224. // inlineStringValues.append("text-align:justify;");
  225. // // pdfParagraph.setAlignment(ElementTags.ALIGN_JUSTIFIED);
  226. // break;
  227. //
  228. // default:
  229. // break;
  230. // }
  231. //
  232. // writer.setAttribute("style", inlineStringValues.toString());
  233. // writer.endElementNotEnclosed();
  234. //
  235. // // TODO:
  236. // for (XWPFRun o : p.getRuns()) {
  237. // visit(o);
  238. // }
  239. // // PLQ : I don't know why but I looks better this way...
  240. //
  241. // if (p.getRuns().isEmpty()) {
  242. // writer.startEndElement(BR_ELEMENT);
  243. // }
  244. //
  245. // writer.endElement(P_ELEMENT);
  246. //
  247. // }
  248. //
  249. // private void visit(XWPFRun run) throws Exception {
  250. //
  251. // // Font font = null;
  252. // boolean hasFont = false;
  253. // // FIXME : should I cache the fonts ?
  254. // String docFontFamilly = run.getFontFamily();
  255. // if (docFontFamilly != null) {
  256. // hasFont = true;
  257. // // TODO: discover appropiate font from platform....
  258. // // BaseFont bf = BaseFont.createFont(docFontFamilly,
  259. // // BaseFont.MACROMAN, BaseFont.EMBEDDED);
  260. // writer.startElementNotEnclosed("font");
  261. // writer.setAttribute("face", docFontFamilly);
  262. // writer.setAttribute("size", String.valueOf(run.getFontSize()));
  263. // // TODO : font...
  264. // // font.setSize(run.getFontSize());
  265. // // if (run.isBold() && run.isItalic()) {
  266. // // font.setStyle(Font.BOLDITALIC);
  267. // // } else if (run.isBold()) {
  268. // // font.setStyle(Font.BOLD);
  269. // // } else if (run.isItalic()) {
  270. // // font.setStyle(Font.ITALIC);
  271. // // }
  272. // // XXX not here
  273. //
  274. // }
  275. // if (run.getCTR().getRPr() != null) {
  276. //
  277. // CTColor ctColor = run.getCTR().getRPr().getColor();
  278. //
  279. // if (ctColor != null) {
  280. // STHexColor col = ctColor.xgetVal();
  281. // String hexColor = col.getStringValue();
  282. // if (hexColor != null && !"auto".equals(hexColor)) {
  283. // // font.setColor(Color.decode("0x" + hexColor));
  284. // writer.setAttribute("color", hexColor);
  285. // }
  286. // }
  287. // }
  288. //
  289. // boolean italic = false;
  290. // if (run.isItalic()) {
  291. // writer.startElementNotEnclosed("I");
  292. // italic = true;
  293. // }
  294. // boolean bold = false;
  295. // if (run.isBold()) {
  296. // writer.startElementNotEnclosed("B");
  297. // bold = true;
  298. // }
  299. // UnderlinePatterns underlinePatterns = run.getUnderline();
  300. //
  301. // boolean underlined = false;
  302. // switch (underlinePatterns) {
  303. // case SINGLE:
  304. // underlined = true;
  305. // writer.startElementNotEnclosed("u");
  306. // break;
  307. //
  308. // default:
  309. // break;
  310. // }
  311. // List<CTBr> brs = run.getCTR().getBrList();
  312. //
  313. // for (Iterator<CTBr> iterator = brs.iterator(); iterator.hasNext();) {
  314. // writer.startElement("br");
  315. // }
  316. //
  317. // List<CTText> texts = run.getCTR().getTList();
  318. // for (CTText ctText : texts) {
  319. // writer.setText(ctText.getStringValue());
  320. // }
  321. // List<XWPFPicture> embeddedPictures = run.getEmbeddedPictures();
  322. // for (XWPFPicture xwpfPicture : embeddedPictures) {
  323. // // TODO: image..
  324. // // Image img = visit(xwpfPicture);
  325. // // pdfParagraph.add(img);
  326. // }
  327. //
  328. // if (underlined)
  329. // writer.endElement("u");
  330. // if (bold)
  331. // writer.endElement("B");
  332. // if (italic)
  333. // writer.endElement("I");
  334. // if (hasFont)
  335. // writer.endElement("font");
  336. // }
  337. // //
  338. // // private Image visit(XWPFPicture xwpfPicture)
  339. // // throws BadElementException, MalformedURLException, IOException {
  340. // // CTPositiveSize2D ext = xwpfPicture.getCTPicture().getSpPr().getXfrm()
  341. // // .getExt();
  342. // // long x = ext.getCx();
  343. // // long y = ext.getCy();
  344. // //
  345. // // CTPicture ctPic = xwpfPicture.getCTPicture();
  346. // // String blipId = ctPic.getBlipFill().getBlip().getEmbed();
  347. // //
  348. // // XWPFPictureData pictureData = getPictureData(blipId);
  349. // //
  350. // // if (pictureData != null) {
  351. // // try {
  352. // // Image img = Image.getInstance(pictureData.getData());
  353. // // System.out.println(img);
  354. // //
  355. // // img.scaleAbsolute(dxa2points(x) / 635, dxa2points(y) / 635);
  356. // //
  357. // // return img;
  358. // // //
  359. // // } catch (Exception e) {
  360. // // LOG.error(e.getMessage());
  361. // // }
  362. // //
  363. // // }
  364. // // return null;
  365. // // }
  366. // //
  367. // // private Paragraph visit(XWPFTable table) throws Exception {
  368. // // Paragraph aParagraph = new Paragraph();
  369. // // // XXX 1f sounds reasonable...
  370. // //
  371. // // boolean left = true, right = true, bottom = true, top = true;
  372. // //
  373. // // if (table.getCTTbl().getTblPr().getTblBorders() != null) {
  374. // //
  375. // // CTTblBorders borders = table.getCTTbl().getTblPr().getTblBorders();
  376. // // if (borders.getLeft() != null) {
  377. // // left = !(STBorder.NONE == borders.getLeft().getVal());
  378. // // }
  379. // // if (borders.getRight() != null) {
  380. // // right = !(STBorder.NONE == borders.getRight().getVal());
  381. // // }
  382. // // if (borders.getBottom() != null) {
  383. // // bottom = !(STBorder.NONE == borders.getBottom().getVal());
  384. // // }
  385. // // if (borders.getTop() != null) {
  386. // // top = !(STBorder.NONE == borders.getTop().getVal());
  387. // // }
  388. // // }
  389. // // List<XWPFTableRow> rows = table.getRows();
  390. // //
  391. // // CTTblGrid grid = table.getCTTbl().getTblGrid();
  392. // // List<CTTblGridCol> cols = grid.getGridColList();
  393. // //
  394. // // float total = 0;
  395. // // float[] colWidths = new float[cols.size()];
  396. // // for (int i = 0; i < colWidths.length; i++) {
  397. // // total += dxa2points(cols.get(i).getW());
  398. // // colWidths[i] = dxa2points(cols.get(i).getW());
  399. // // }
  400. // //
  401. // // PdfPTable aTable = new PdfPTable(cols.size());
  402. // //
  403. // // aTable.setTotalWidth(colWidths);
  404. // // aTable.setLockedWidth(true);
  405. // //
  406. // // for (XWPFTableRow xwpfTableRow : rows) {
  407. // //
  408. // // List<XWPFTableCell> cells = xwpfTableRow.getTableCells();
  409. // // int height = xwpfTableRow.getHeight();
  410. // //
  411. // // for (XWPFTableCell xwpfTableCell : cells) {
  412. // // CTShd shd = xwpfTableCell.getCTTc().getTcPr().getShd();
  413. // // String hexColor = null;
  414. // // if (shd != null) {
  415. // // hexColor = shd.xgetFill().getStringValue();
  416. // // }
  417. // // List<IBodyElement> elements = xwpfTableCell.getBodyElements();
  418. // // PdfPCell aCell = new PdfPCell();
  419. // // if (!left)
  420. // // aCell.disableBorderSide(PdfPCell.LEFT);
  421. // // if (!right)
  422. // // aCell.disableBorderSide(PdfPCell.RIGHT);
  423. // // if (!bottom)
  424. // // aCell.disableBorderSide(PdfPCell.BOTTOM);
  425. // // if (!top)
  426. // // aCell.disableBorderSide(PdfPCell.TOP);
  427. // //
  428. // // if (!elements.isEmpty()) {
  429. // // if (elements.size() == 1) {
  430. // // // single content
  431. // // IBodyElement iBodyElement = elements.get(0);
  432. // // if (iBodyElement instanceof XWPFParagraph) {
  433. // // XWPFParagraph paragraph = (XWPFParagraph) iBodyElement;
  434. // // if (paragraph.getRuns().size() == 1) {
  435. // // // iText can only handle one picture in a
  436. // // // Cell...
  437. // // XWPFRun run = paragraph.getRuns().get(0);
  438. // // if (run.getEmbeddedPictures().size() > 0) {
  439. // // Image img = visit(run
  440. // // .getEmbeddedPictures().get(0));
  441. // // aCell.setImage(img);
  442. // // } else {
  443. // // Paragraph pdfParagraph = visit(paragraph);
  444. // // aCell.addElement(pdfParagraph);
  445. // // }
  446. // // }
  447. // // // TODO ???
  448. // // // else {
  449. // // // Paragraph
  450. // // // pdfParagraph=processParagraph(paragraph);
  451. // // // aCell.setPhrase(pdfParagraph);
  452. // // // }
  453. // // }
  454. // // } else {
  455. // //
  456. // // for (IBodyElement iBodyElement : elements) {
  457. // //
  458. // // Paragraph singleParagraph = visit(iBodyElement);
  459. // // aCell.addElement(singleParagraph);
  460. // // }
  461. // //
  462. // // }
  463. // //
  464. // // }
  465. // //
  466. // // if (hexColor != null && !"auto".equals(hexColor)) {
  467. // // aCell.setBackgroundColor(Color.decode("0x" + hexColor));
  468. // //
  469. // // }
  470. // // aCell.setMinimumHeight(dxa2points(height));
  471. // // aTable.addCell(aCell);
  472. // //
  473. // // }
  474. // //
  475. // // }
  476. // //
  477. // // aParagraph.add(aTable);
  478. // // // pdfDoc.add(aParagraph);
  479. // // return aParagraph;
  480. // // }
  481. }