fix: Fixed pagination with paragraph break-before property located in list
This commit is contained in:
parent
80b7005066
commit
5566e5ff43
1 changed files with 73 additions and 0 deletions
73
src/main/java/w2phtml/pageSplitters/ListBreaksFix.java
Normal file
73
src/main/java/w2phtml/pageSplitters/ListBreaksFix.java
Normal file
|
@ -0,0 +1,73 @@
|
|||
package w2phtml.pageSplitters;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.xpath.XPath;
|
||||
import javax.xml.xpath.XPathConstants;
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import pro.litvinovg.w2phtml.gui.ConversionExecutor;
|
||||
import pro.litvinovg.xml.Debug;
|
||||
import w2phtml.office.OfficeReader;
|
||||
import w2phtml.office.StyleWithProperties;
|
||||
import w2phtml.util.Misc;
|
||||
|
||||
import static w2phtml.office.XMLString.TEXT_LIST_ITEM;
|
||||
import static w2phtml.office.XMLString.TEXT_SOFT_PAGE_BREAK;
|
||||
import static w2phtml.office.XMLString.TEXT_STYLE_NAME;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import static w2phtml.office.XMLString.TEXT_P;
|
||||
import static w2phtml.office.XMLString.TEXT_H;
|
||||
import static w2phtml.office.XMLString.FO_BREAK_BEFORE;
|
||||
|
||||
|
||||
|
||||
public class ListBreaksFix {
|
||||
private static final Logger logger = LoggerFactory.getLogger(ListBreaksFix.class);
|
||||
private OfficeReader ofr;
|
||||
|
||||
public ListBreaksFix(OfficeReader ofr) {
|
||||
this.ofr = ofr;
|
||||
}
|
||||
// Hack to fix hard breaks splitting in lists
|
||||
public void addSPBsBeforeBreaksInLists(Node onode) {
|
||||
try {
|
||||
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder builder = builderFactory.newDocumentBuilder();
|
||||
Document document = onode.getOwnerDocument();
|
||||
XPath xPath = XPathFactory.newInstance().newXPath();
|
||||
String expression = "//*[starts-with(local-name(),'list-item')]//*[starts-with(local-name(),'p') ]";
|
||||
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET);
|
||||
for (int i = 0; i < nodeList.getLength(); i++) {
|
||||
Node paragraph = nodeList.item(i);
|
||||
if (hasBreakBefore(paragraph)) {
|
||||
Node spb = document.createElement(TEXT_SOFT_PAGE_BREAK);
|
||||
paragraph.getParentNode().insertBefore(spb, paragraph);
|
||||
}
|
||||
}
|
||||
} catch (XPathExpressionException e) {
|
||||
logger.error("Error fixing hard breaks in lists" + e.getLocalizedMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParserConfigurationException e) {
|
||||
logger.error("Error fixing hard breaks in lists" + e.getLocalizedMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
private boolean hasBreakBefore(Node node) {
|
||||
StyleWithProperties style = ofr.getParStyle(Misc.getAttribute(node,TEXT_STYLE_NAME));
|
||||
if (style != null && "page".equals(style.getProperty(FO_BREAK_BEFORE))) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue