more progress with WordToFoExtractor, see Bugzilla 51351
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1136001 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ffc5d68b12
commit
cbb3176c72
@ -279,8 +279,27 @@ public class WordToFoExtractor {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
protected void processImage(Element currentBlock, Picture picture) {
|
||||
/**
|
||||
* This method shall store image bytes in external file and convert it if
|
||||
* necessary. Images shall be stored using PNG format (for bitmap) or SVG
|
||||
* (for vector). Other formats may be not supported by your XSL FO
|
||||
* processor.
|
||||
* <p>
|
||||
* Please note the
|
||||
* {@link WordToFoUtils#setPictureProperties(Picture, Element)} method.
|
||||
*
|
||||
* @param currentBlock
|
||||
* currently processed FO element, like <tt>fo:block</tt>. Shall
|
||||
* be used as parent of newly created
|
||||
* <tt>fo:external-graphic</tt> or
|
||||
* <tt>fo:instream-foreign-object</tt>
|
||||
* @param inlined
|
||||
* if image is inlined
|
||||
* @param picture
|
||||
* HWPF object, contained picture data and properties
|
||||
*/
|
||||
protected void processImage(Element currentBlock, boolean inlined,
|
||||
Picture picture) {
|
||||
// no default implementation -- skip
|
||||
}
|
||||
|
||||
@ -329,11 +348,24 @@ public class WordToFoExtractor {
|
||||
for (int c = 0; c < charRuns; c++) {
|
||||
CharacterRun characterRun = paragraph.getCharacterRun(c);
|
||||
|
||||
if (hwpfDocument.getPicturesTable().hasPicture(characterRun)) {
|
||||
Picture picture = hwpfDocument.getPicturesTable()
|
||||
.extractPicture(characterRun, true);
|
||||
|
||||
processImage(block, characterRun.text().charAt(0) == 0x01,
|
||||
picture);
|
||||
continue;
|
||||
}
|
||||
|
||||
String text = characterRun.text();
|
||||
if (text.getBytes().length == 0)
|
||||
continue;
|
||||
|
||||
if (text.getBytes()[0] == FIELD_BEGIN_MARK) {
|
||||
/*
|
||||
* check if we have a field with calculated image as a result.
|
||||
* MathType equation, for example.
|
||||
*/
|
||||
int skipTo = tryImageWithinField(hwpfDocument, paragraph, c,
|
||||
block);
|
||||
|
||||
@ -553,6 +585,7 @@ public class WordToFoExtractor {
|
||||
Paragraph paragraph, int beginMark, Element currentBlock) {
|
||||
int separatorMark = -1;
|
||||
int pictureMark = -1;
|
||||
int pictureChar = Integer.MIN_VALUE;
|
||||
int endMark = -1;
|
||||
for (int c = beginMark + 1; c < paragraph.numCharacterRuns(); c++) {
|
||||
CharacterRun characterRun = paragraph.getCharacterRun(c);
|
||||
@ -582,12 +615,13 @@ public class WordToFoExtractor {
|
||||
}
|
||||
|
||||
if (hwpfDocument.getPicturesTable().hasPicture(characterRun)) {
|
||||
if (pictureMark != -1) {
|
||||
if (c != -1) {
|
||||
// double;
|
||||
return beginMark;
|
||||
}
|
||||
|
||||
pictureMark = c;
|
||||
pictureChar = characterRun.text().charAt(0);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -598,12 +632,12 @@ public class WordToFoExtractor {
|
||||
final CharacterRun pictureRun = paragraph.getCharacterRun(pictureMark);
|
||||
final Picture picture = hwpfDocument.getPicturesTable().extractPicture(
|
||||
pictureRun, true);
|
||||
processImage(currentBlock, picture);
|
||||
|
||||
processImage(currentBlock, pictureChar == 0x01, picture);
|
||||
|
||||
return endMark;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Java main() interface to interact with WordToFoExtractor
|
||||
*
|
||||
|
@ -9,6 +9,7 @@ import org.apache.poi.hwpf.usermodel.BorderCode;
|
||||
import org.apache.poi.hwpf.usermodel.CharacterProperties;
|
||||
import org.apache.poi.hwpf.usermodel.CharacterRun;
|
||||
import org.apache.poi.hwpf.usermodel.Paragraph;
|
||||
import org.apache.poi.hwpf.usermodel.Picture;
|
||||
import org.apache.poi.hwpf.usermodel.Range;
|
||||
import org.apache.poi.hwpf.usermodel.Section;
|
||||
import org.apache.poi.hwpf.usermodel.SectionProperties;
|
||||
@ -179,6 +180,31 @@ public class WordToFoUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static String getJustification(int js) {
|
||||
switch (js) {
|
||||
case 0:
|
||||
return "start";
|
||||
case 1:
|
||||
return "center";
|
||||
case 2:
|
||||
return "end";
|
||||
case 3:
|
||||
case 4:
|
||||
return "justify";
|
||||
case 5:
|
||||
return "center";
|
||||
case 6:
|
||||
return "left";
|
||||
case 7:
|
||||
return "start";
|
||||
case 8:
|
||||
return "end";
|
||||
case 9:
|
||||
return "justify";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public static String getListItemNumberLabel(int number, int format) {
|
||||
|
||||
if (format != 0)
|
||||
@ -283,6 +309,9 @@ public class WordToFoUtils {
|
||||
textDecorations.append(" ");
|
||||
textDecorations.append("underline");
|
||||
}
|
||||
if (characterRun.isVanished()) {
|
||||
inline.setAttribute("visibility", "hidden");
|
||||
}
|
||||
if (textDecorations.length() > 0) {
|
||||
inline.setAttribute("text-decoration", textDecorations.toString());
|
||||
}
|
||||
@ -336,39 +365,9 @@ public class WordToFoUtils {
|
||||
|
||||
public static void setJustification(Paragraph paragraph,
|
||||
final Element element) {
|
||||
final int justification = paragraph.getJustification();
|
||||
switch (justification) {
|
||||
case 0:
|
||||
element.setAttribute("text-align", "start");
|
||||
break;
|
||||
case 1:
|
||||
element.setAttribute("text-align", "center");
|
||||
break;
|
||||
case 2:
|
||||
element.setAttribute("text-align", "end");
|
||||
break;
|
||||
case 3:
|
||||
element.setAttribute("text-align", "justify");
|
||||
break;
|
||||
case 4:
|
||||
element.setAttribute("text-align", "justify");
|
||||
break;
|
||||
case 5:
|
||||
element.setAttribute("text-align", "center");
|
||||
break;
|
||||
case 6:
|
||||
element.setAttribute("text-align", "left");
|
||||
break;
|
||||
case 7:
|
||||
element.setAttribute("text-align", "start");
|
||||
break;
|
||||
case 8:
|
||||
element.setAttribute("text-align", "end");
|
||||
break;
|
||||
case 9:
|
||||
element.setAttribute("text-align", "justify");
|
||||
break;
|
||||
}
|
||||
String justification = getJustification(paragraph.getJustification());
|
||||
if (isNotEmpty(justification))
|
||||
element.setAttribute("text-align", justification);
|
||||
}
|
||||
|
||||
public static void setParagraphProperties(Paragraph paragraph, Element block) {
|
||||
@ -399,6 +398,53 @@ public class WordToFoUtils {
|
||||
block.setAttribute("white-space-collapse", "false");
|
||||
}
|
||||
|
||||
public static void setPictureProperties(Picture picture,
|
||||
Element graphicElement) {
|
||||
final int aspectRatioX = picture.getAspectRatioX();
|
||||
final int aspectRatioY = picture.getAspectRatioY();
|
||||
|
||||
if (aspectRatioX > 0) {
|
||||
graphicElement.setAttribute("content-width", ((picture.getDxaGoal()
|
||||
* aspectRatioX / 100) / WordToFoUtils.TWIPS_PER_PT)
|
||||
+ "pt");
|
||||
} else
|
||||
graphicElement.setAttribute("content-width",
|
||||
(picture.getDxaGoal() / WordToFoUtils.TWIPS_PER_PT) + "pt");
|
||||
|
||||
if (aspectRatioY > 0)
|
||||
graphicElement
|
||||
.setAttribute("content-height", ((picture.getDyaGoal()
|
||||
* aspectRatioY / 100) / WordToFoUtils.TWIPS_PER_PT)
|
||||
+ "pt");
|
||||
else
|
||||
graphicElement.setAttribute("content-height",
|
||||
(picture.getDyaGoal() / WordToFoUtils.TWIPS_PER_PT) + "pt");
|
||||
|
||||
if (aspectRatioX <= 0 || aspectRatioY <= 0) {
|
||||
graphicElement.setAttribute("scaling", "uniform");
|
||||
} else {
|
||||
graphicElement.setAttribute("scaling", "non-uniform");
|
||||
}
|
||||
|
||||
graphicElement.setAttribute("vertical-align", "text-bottom");
|
||||
|
||||
if (picture.getDyaCropTop() != 0 || picture.getDxaCropRight() != 0
|
||||
|| picture.getDyaCropBottom() != 0
|
||||
|| picture.getDxaCropLeft() != 0) {
|
||||
int rectTop = picture.getDyaCropTop() / WordToFoUtils.TWIPS_PER_PT;
|
||||
int rectRight = picture.getDxaCropRight()
|
||||
/ WordToFoUtils.TWIPS_PER_PT;
|
||||
int rectBottom = picture.getDyaCropBottom()
|
||||
/ WordToFoUtils.TWIPS_PER_PT;
|
||||
int rectLeft = picture.getDxaCropLeft()
|
||||
/ WordToFoUtils.TWIPS_PER_PT;
|
||||
graphicElement.setAttribute("clip", "rect(" + rectTop + "pt, "
|
||||
+ rectRight + "pt, " + rectBottom + "pt, " + rectLeft
|
||||
+ "pt)");
|
||||
graphicElement.setAttribute("oveerflow", "hidden");
|
||||
}
|
||||
}
|
||||
|
||||
public static void setTableCellProperties(TableRow tableRow,
|
||||
TableCell tableCell, Element element, boolean toppest,
|
||||
boolean bottomest, boolean leftest, boolean rightest) {
|
||||
|
Loading…
Reference in New Issue
Block a user