Changeset 1135


Ignore:
Timestamp:
07/08/10 13:00:13 (19 months ago)
Author:
jharrop
Message:

PDF via XSL FO: support for multiple sections

Location:
trunk/docx4j
Files:
4 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/docx4j/src/main/java/org/docx4j/convert/out/pdf/viaXSLFO/Conversion.java

    r1127 r1135  
    3333import org.docx4j.fonts.PhysicalFonts; 
    3434import org.docx4j.jaxb.Context; 
     35import org.docx4j.jaxb.NamespacePrefixMapperUtils; 
    3536import org.docx4j.model.PropertyResolver; 
    3637import org.docx4j.model.TransformState; 
     
    4142import org.docx4j.model.properties.paragraph.Indent; 
    4243import org.docx4j.model.properties.run.Font; 
     44import org.docx4j.model.structure.SectionWrapper; 
     45import org.docx4j.model.structure.jaxb.ObjectFactory; 
     46import org.docx4j.model.structure.jaxb.Sections; 
     47import org.docx4j.model.structure.jaxb.Sections.Section; 
    4348import org.docx4j.model.table.TableModel.TableModelTransformState; 
    4449import org.docx4j.openpackaging.exceptions.Docx4JException; 
    4550import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
     51import org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 
    4652import org.docx4j.wml.Ftr; 
    4753import org.docx4j.wml.Hdr; 
     
    4955import org.docx4j.wml.RFonts; 
    5056import org.docx4j.wml.RPr; 
     57import org.docx4j.wml.SectPr; 
    5158import org.docx4j.wml.Tbl; 
    5259import org.docx4j.wml.Tc; 
     
    261268           */ 
    262269          //Document domDoc = XmlPackage.getFlatDomDocument(wordMLPackage); 
    263           Document domDoc = XmlUtils.marshaltoW3CDomDocument(wordMLPackage.getMainDocumentPart().getJaxbElement()); 
     270          //Document domDoc = XmlUtils.marshaltoW3CDomDocument(wordMLPackage.getMainDocumentPart().getJaxbElement()); 
     271           
     272          Sections sections = createSectionContainers(wordMLPackage); 
     273          Document domDoc = XmlUtils.marshaltoW3CDomDocument(sections, Context.jcSectionModel); 
    264274           
    265275          java.util.HashMap<String, Object> settings = new java.util.HashMap<String, Object>(); 
     
    330340                 
    331341        } 
     342     
     343        private Sections createSectionContainers(WordprocessingMLPackage wordMLPackage) { 
     344                                 
     345                ObjectFactory factory = new ObjectFactory(); 
     346                 
     347                Sections sections = factory.createSections(); 
     348                Section section = factory.createSectionsSection(); 
     349                section.setName("s1"); // name must match fo master 
     350                 
     351                sections.getSection().add(section); 
     352                                                 
     353                org.docx4j.wml.Document doc = (org.docx4j.wml.Document)wordMLPackage.getMainDocumentPart().getJaxbElement(); 
     354                 
     355                int i = 2; 
     356                for (Object o : doc.getBody().getEGBlockLevelElts() ) { 
     357                         
     358                        if (o instanceof org.docx4j.wml.P) { 
     359                                if (((org.docx4j.wml.P)o).getPPr() != null ) { 
     360                                        org.docx4j.wml.PPr ppr = ((org.docx4j.wml.P)o).getPPr(); 
     361                                        if (ppr.getSectPr()!=null) { 
     362                                                section = factory.createSectionsSection(); 
     363                                                section.setName("s" +i); // name must match fo master 
     364                                                sections.getSection().add(section);      
     365                                                i++; 
     366                                        } 
     367                                }                                
     368                        }  
     369                        section.getAny().add( marshall(o) ); 
     370                                // TODO: since the section model knows nothing about WML, 
     371                                // we have to marshall each object separately. 
     372                                // To fix this, next time wml is generated, include the section model there! 
     373                } 
     374                return sections;                                 
     375        } 
     376     
     377        private Element marshall(Object o) { 
     378                 
     379                try { 
     380                        org.w3c.dom.Document w3cDoc =  
     381                                XmlUtils.marshaltoW3CDomDocument(o); 
     382                         
     383                         
     384                                /* Force the RelationshipsPart to be marshalled using 
     385                                 * the normal non-rels part NamespacePrefixMapper, 
     386                                 * since otherwise (because we'd be using 2 namespace 
     387                                 * prefix mappers?) we end up with errant xmlns="", 
     388                                 * which is wrong and stops Word 2007 from loading the 
     389                                 * document. 
     390                                 *  
     391                                 * Note that xmlPackage.xsd defines: 
     392                                 *      <xsd:complexType name="CT_XmlData"> 
     393                                                <xsd:sequence> 
     394                                                        <xsd:any processContents="skip" /> 
     395                                                </xsd:sequence> 
     396                                 * 
     397                                 * Note also that marshaltoString uses  
     398                                 * just the normal non-rels part NamespacePrefixMapper, 
     399                                 * so if/when this is marshalled again, that could 
     400                                 * have been causing problems as well??  
     401                                 */ 
     402                return w3cDoc.getDocumentElement();                      
     403                } catch (Exception e) { 
     404                        // TODO Auto-generated catch block 
     405                        e.printStackTrace(); 
     406                }                        
     407                return null; 
     408                 
     409        } 
     410         
     411         
    332412 
    333413    /* ---------------Xalan XSLT Extension Functions ---------------- */ 
  • trunk/docx4j/src/main/java/org/docx4j/convert/out/pdf/viaXSLFO/docx2fo.xslt

    r1131 r1135  
    7979</xsl:template> 
    8080 
    81 <!--  Not used, if we just pass in document.xml --> 
     81<!--  Not used, if we just pass in document.xml 
    8282<xsl:template match="/pkg:package"> 
    8383 
     
    8787 
    8888  <xsl:template match="w:document"> 
     89   
     90  --> 
     91   
     92   
     93  <xsl:template match="sections"> 
    8994   
    9095                <xsl:variable name="logging"  
     
    100105                <fo:root> 
    101106 
    102                         <fo:layout-master-set> 
    103                                 <!-- fo:layout-master-set defines in its children the page layout: 
    104                                         the pagination and layout specifications 
    105                                         - page-masters: have the role of describing the intended subdivisions 
    106                                         of a page and the geometry of these subdivisions 
    107                                         In this case there is only a simple-page-master which defines the 
    108                                         layout for all pages of the text 
    109                                          
    110                                         We handle headers/footers, but not yet on a per section basis.   
    111                                          
    112                                         See http://www.dpawson.co.uk/xsl/sect3/headers.html                              
    113                                 --> 
    114  
    115                                         <!--  First Page --> 
    116                                         <xsl:if 
    117                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasFirstHeaderOrFooter($wmlPackage)"> 
    118                                                 <fo:simple-page-master master-name="firstpage" 
    119                                                         page-height="297mm" page-width="210mm" margin-top="10mm" 
    120                                                         margin-bottom="10mm" margin-left="25mm" margin-right="20mm"> 
    121                                                          
    122                                                         <fo:region-body margin-top="20mm" 
    123                                                                 margin-bottom="20mm" margin-left="0mm" margin-right="0mm" /> 
    124  
    125  
    126                                                         <!--  First Page Header --> 
    127                                                         <xsl:if 
    128                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasFirstHeader($wmlPackage)"> 
    129                                                                 <fo:region-before 
    130                                                                         region-name="xsl-region-before-firstpage" extent="10mm" /> 
    131                                                         </xsl:if> 
    132  
    133                                                         <!--  First Page Footer --> 
    134                                                         <xsl:if 
    135                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasFirstFooter($wmlPackage)"> 
    136                                                                 <fo:region-after 
    137                                                                         region-name="xsl-region-after-firstpage" extent="10mm" /> 
    138                                                         </xsl:if> 
    139  
    140                                                 </fo:simple-page-master> 
    141                                         </xsl:if> 
    142                                         <xsl:if 
    143                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasEvenOrOddHeaderOrFooter($wmlPackage)"> 
    144                                                 <!-- layout for the even page --> 
    145                                                 <fo:simple-page-master master-name="evenpage" 
    146                                                         page-height="297mm" page-width="210mm" margin-top="10mm" 
    147                                                         margin-bottom="10mm" margin-left="25mm" margin-right="20mm"> 
    148                                                          
    149                                                         <fo:region-body margin-top="20mm" 
    150                                                                 margin-bottom="20mm" margin-left="0mm" margin-right="0mm" /> 
    151                                                         <xsl:if 
    152                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasEvenHeader($wmlPackage)"> 
    153                                                                 <fo:region-before 
    154                                                                         region-name="xsl-region-before-evenpage" extent="10mm" /> 
    155                                                         </xsl:if> 
    156                                                         <xsl:if 
    157                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasEvenFooter($wmlPackage)"> 
    158                                                                 <fo:region-after 
    159                                                                         region-name="xsl-region-after-evenpage" extent="10mm" /> 
    160                                                         </xsl:if> 
    161                                                 </fo:simple-page-master> 
    162                                                 <!-- layout for the odd page --> 
    163                                                 <fo:simple-page-master master-name="oddpage" 
    164                                                         page-height="297mm" page-width="210mm" margin-top="10mm" 
    165                                                         margin-bottom="10mm" margin-left="25mm" margin-right="20mm"> 
    166                                                          
    167                                                         <fo:region-body margin-top="20mm" 
    168                                                                 margin-bottom="20mm" margin-left="0mm" margin-right="0mm" /> 
    169                                                         <xsl:if 
    170                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasOddHeader($wmlPackage)"> 
    171                                                                 <fo:region-before 
    172                                                                         region-name="xsl-region-before-default" extent="10mm" /> 
    173                                                         </xsl:if> 
    174                                                         <xsl:if 
    175                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasOddFooter($wmlPackage)"> 
    176                                                                 <fo:region-after 
    177                                                                         region-name="xsl-region-after-default" extent="10mm" /> 
    178                                                         </xsl:if> 
    179                                                 </fo:simple-page-master> 
    180                                         </xsl:if> 
    181                                         <xsl:if 
    182                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasDefaultHeaderOrFooter($wmlPackage)"> 
    183                                                 <fo:simple-page-master master-name="default" 
    184                                                         page-height="297mm" page-width="210mm" margin-top="10mm" 
    185                                                         margin-bottom="10mm" margin-left="25mm" margin-right="20mm"> 
    186                                                          
    187                                                         <fo:region-body margin-top="20mm" 
    188                                                                 margin-bottom="20mm" margin-left="0mm" margin-right="0mm" /> 
    189                                                         <xsl:if 
    190                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasDefaultHeader($wmlPackage)"> 
    191                                                                 <fo:region-before 
    192                                                                         region-name="xsl-region-before-default" extent="10mm" /> 
    193                                                         </xsl:if> 
    194                                                         <xsl:if 
    195                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasDefaultFooter($wmlPackage)"> 
    196                                                                 <fo:region-after 
    197                                                                         region-name="xsl-region-after-default" extent="10mm" /> 
    198                                                         </xsl:if> 
    199                                                 </fo:simple-page-master> 
    200                                         </xsl:if> 
    201  
    202                                         <fo:simple-page-master master-name="simple" 
    203                                                 page-height="29.7cm" page-width="21cm" margin-top="1cm" 
    204                                                 margin-bottom="2cm" margin-left="2.5cm" margin-right="2.5cm"> 
    205                                                 <fo:region-body margin-top="3cm" /> 
    206                                                 <fo:region-before extent="3cm" /> 
    207                                                 <fo:region-after extent="1.5cm" /> 
    208                                         </fo:simple-page-master> 
    209  
    210  
    211                                 <fo:page-sequence-master master-name="twoside"> 
    212  
    213                                         <fo:repeatable-page-master-alternatives> 
    214                                                         <xsl:if 
    215                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasFirstHeaderOrFooter($wmlPackage)"> 
    216                                                                 <fo:conditional-page-master-reference 
    217                                                                         master-reference="firstpage" page-position="first" /> 
    218                                                         </xsl:if> 
    219                                                          
    220                                                         <xsl:choose> 
    221                                                                 <xsl:when test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasEvenHeaderOrFooter($wmlPackage)"> 
    222                                                                         <fo:conditional-page-master-reference 
    223                                                                                 master-reference="evenpage" odd-or-even="even" /> 
    224                                                                         <fo:conditional-page-master-reference 
    225                                                                                 master-reference="oddpage" odd-or-even="odd" /> 
    226                                                                 </xsl:when> 
    227                                                                 <xsl:when test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasDefaultHeaderOrFooter($wmlPackage)"> 
    228                                                                         <fo:conditional-page-master-reference 
    229                                                                                 master-reference="default" />    
    230                                                                 </xsl:when> 
    231                                                                 <xsl:otherwise> 
    232                                                                         <fo:conditional-page-master-reference 
    233                                                                                 master-reference="simple" />                                                                                                                             
    234                                                                 </xsl:otherwise> 
    235                                                         </xsl:choose> 
    236 <!--  
    237                                                         <xsl:if 
    238                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasDefaultFooter($wmlPackage)"> 
    239                                                                 <fo:conditional-page-master-reference 
    240                                                                         master-reference="default" /> 
    241                                                         </xsl:if> 
    242                                                         <xsl:if 
    243                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasOddHeaderOrFooter($wmlPackage)"> 
    244                                                                 <fo:conditional-page-master-reference 
    245                                                                         master-reference="oddpage" odd-or-even="odd" /> 
    246                                                         </xsl:if> 
    247                                                         <xsl:if 
    248                                                                 test="java:org.docx4j.model.structure.HeaderFooterPolicy.hasEvenHeaderOrFooter($wmlPackage)"> 
    249                                                                 <fo:conditional-page-master-reference 
    250                                                                         master-reference="evenpage" odd-or-even="even" /> 
    251                                                         </xsl:if> 
    252  -->                                                     
    253                                         </fo:repeatable-page-master-alternatives> 
    254                                 </fo:page-sequence-master> 
    255                         </fo:layout-master-set> 
     107                <xsl:copy-of select="java:org.docx4j.convert.out.pdf.viaXSLFO.LayoutMasterSetBuilder.getLayoutMasterSetFragment(  
     108                        $wmlPackage)" /> 
     109                         
     110                        <xsl:apply-templates match="section"/> 
     111 
     112                </fo:root> 
     113  </xsl:template> 
     114 
     115 
     116        <xsl:template match="section"> 
     117         
    256118 
    257119                        <!-- start page-sequence 
     
    261123                                which is to be used to layout the text contained in this 
    262124                                page-sequence--> 
    263                         <fo:page-sequence master-reference="twoside"> 
     125                        <fo:page-sequence master-reference="{@name}"> 
    264126 
    265127                                <!--  First Page Header --> 
     
    396258                                                select="java:org.docx4j.convert.out.pdf.viaXSLFO.PartTracker.inMainDocumentPart($wmlPackage, $modelStates)" /> 
    397259 
    398                                         <xsl:apply-templates select="w:body/*" /> 
     260                                        <!--<xsl:apply-templates select="w:body/*" />--> 
     261                                        <xsl:apply-templates select="*" /> 
    399262 
    400263                                        <xsl:call-template name="pretty-print-block"/> 
     
    417280 
    418281                        <!-- end: defines page layout --> 
    419  
    420  
    421  
    422  
    423                 </fo:root> 
    424   </xsl:template> 
     282         
     283         
     284        </xsl:template> 
    425285 
    426286  <!--  the extension functions fetch these 
  • trunk/docx4j/src/main/java/org/docx4j/jaxb/Context.java

    r1121 r1135  
    3333        public static JAXBContext jcDocPropsCustom; 
    3434        public static JAXBContext jcDocPropsExtended; 
    35         public static JAXBContext jcXmlPackage; 
    3635        public static JAXBContext jcRelationships; 
    3736        public static JAXBContext jcCustomXmlProperties; 
    3837        public static JAXBContext jcContentTypes; 
     38 
     39        public static JAXBContext jcXmlPackage; 
     40         
     41        private static JAXBContext jcXslFo; 
     42        public static JAXBContext jcSectionModel; 
    3943         
    4044        private static Logger log = Logger.getLogger(Context.class); 
     
    8185                        jcCustomXmlProperties = JAXBContext.newInstance("org.docx4j.customXmlProperties",classLoader ); 
    8286                        jcContentTypes = JAXBContext.newInstance("org.docx4j.openpackaging.contenttype",classLoader ); 
     87                         
     88                        jcSectionModel = JAXBContext.newInstance("org.docx4j.model.structure.jaxb",classLoader ); 
     89                         
    8390                        log.info(".. others loaded .."); 
    8491                         
     
    98105                 
    99106        } 
    100                  
     107 
     108        public static JAXBContext getXslFoContext() { 
     109                if (jcXslFo==null) { 
     110                        try {    
     111                                Context tmp = new Context(); 
     112                                java.lang.ClassLoader classLoader = tmp.getClass().getClassLoader(); 
     113 
     114                                jcXslFo = JAXBContext.newInstance("org.plutext.jaxb.xslfo",classLoader ); 
     115                                 
     116                        } catch (Exception ex) { 
     117                                ex.printStackTrace(); 
     118                        }                                                
     119                } 
     120                return jcXslFo;          
     121        } 
     122         
    101123} 
  • trunk/docx4j/src/main/java/org/docx4j/model/structure/DocumentModel.java

    r966 r1135  
    6363        // section they are in, and nor does a SectionWrapper 
    6464        // know which objects are in it.   
    65         // We will soon add objects to a SectionWrapper (but not 
    66         // vice versa) 
     65        // Should we add objects to a SectionWrapper?  
     66        // PDF via XSL FO pre-processes the document to wrap 
     67        // section containers, but that is only done in the PDF stuff. 
    6768         
    6869        public DocumentModel(WordprocessingMLPackage wordMLPackage) { 
  • trunk/docx4j/src/main/java/org/docx4j/model/structure/HeaderFooterPolicy.java

    r1127 r1135  
    176176        } 
    177177         
     178                 
     179         
    178180        // ------------------------------------------------------------- 
    179181        // XSLT extension functions, used by docx2fo.xslt 
    180182        // and DocX2Html.xslt 
     183         
     184        // Yuck! Getting rid of as many of these as possible .... 
    181185         
    182186        public static boolean hasFirstHeaderOrFooter(WordprocessingMLPackage wordmlPackage) {                    
  • trunk/docx4j/src/main/java/org/docx4j/model/structure/SectionWrapper.java

    r943 r1135  
    1919 */ 
    2020package org.docx4j.model.structure; 
     21 
     22import java.util.ArrayList; 
     23import java.util.List; 
    2124 
    2225import org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 
     
    7376                return sectPr; 
    7477        } 
     78         
     79//    protected List<Object> egBlockLevelElts; 
     80//       
     81//    public List<Object> getEGBlockLevelElts() { 
     82//        if (egBlockLevelElts == null) { 
     83//            egBlockLevelElts = new ArrayList<Object>(); 
     84//        } 
     85//        return this.egBlockLevelElts; 
     86//    } 
     87         
    7588                         
    7689} 
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/packages/WordprocessingMLPackage.java

    r1050 r1135  
    2525import java.io.FileNotFoundException; 
    2626import java.io.FileOutputStream; 
     27import java.util.HashMap; 
    2728import java.util.Map; 
    2829 
     
    4041import org.docx4j.XmlUtils; 
    4142import org.docx4j.convert.out.flatOpcXml.FlatOpcXmlCreator; 
     43import org.docx4j.convert.out.pdf.viaXSLFO.Conversion; 
     44import org.docx4j.convert.out.pdf.viaXSLFO.PartTracker; 
    4245import org.docx4j.fonts.IdentityPlusMapper; 
    4346import org.docx4j.fonts.Mapper; 
    4447import org.docx4j.jaxb.Context; 
    4548import org.docx4j.jaxb.NamespacePrefixMapperUtils; 
     49import org.docx4j.model.TransformState; 
    4650import org.docx4j.model.structure.DocumentModel; 
    4751import org.docx4j.model.structure.HeaderFooterPolicy; 
     
    417421                 
    418422        } 
    419          
     423 
    420424        public static class FilterSettings { 
    421425                 
  • trunk/docx4j/xsd/sections.xsd

    r1133 r1135  
    11<?xml version="1.0" encoding="utf-8"?> 
    2 <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     2<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"  
     3        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     4        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     5        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:version="2.1" 
     6        jaxb:extensionBindingPrefixes="xjc">  
     7         
     8<!-- 
     9 
     10JAXB INSTRUCTIONS 
     11           
     12  To generate java classes, you need xjc, from the JAXB 2.1 RI. 
     13   
     14  (I used JAXB 2.1.10 included in JDK 1.6.0_15) 
     15                 
     16  To generate the classes (from the same directory)      
     17                         
     18         xjc  sections.xsd -d ~/workspace/docx4j/src/main/java -no-header -target 2.0 -extension 
     19          
     20  It would be nice to be able to add the fluent api 
     21          
     22          sh ~/jaxb-ri-20071219/bin/xjc.sh -classpath ~/workspace/docx4j/m2/org/jvnet/jaxb2_commons/ppp/parent-pointer-plugin/1.0/parent-pointer-plugin-1.0.jar:~/workspace/docx4j/lib/jaxb-fluent-api-2.1.8.jar  -Xfluent-api -Xparent-pointer wml.xsd -d tmp/  -no-header -target 2.0 
     23          
     24  jaxb-ri-20071219 is 2.1.6; jaxb-ri-20070917 works equally well. 
     25   
     26 
     27--> 
     28 
     29        <xs:annotation> 
     30                <xs:appinfo> 
     31                        <xs:appinfo> 
     32                                <jaxb:globalBindings> 
     33                                </jaxb:globalBindings> 
     34                        </xs:appinfo> 
     35                        <jaxb:schemaBindings> 
     36                                <jaxb:package name="org.docx4j.model.structure.jaxb"/> 
     37                        </jaxb:schemaBindings> 
     38                </xs:appinfo> 
     39        </xs:annotation> 
     40 
     41         
    342  <xs:element name="sections"> 
    443    <xs:complexType> 
     
    746          <xs:complexType> 
    847            <xs:sequence> 
    9               <xs:any processContents="skip" minOccurs="0" /> 
     48              <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" /> 
    1049            </xs:sequence> 
    1150            <xs:attribute name="name" type="xs:string" use="required" /> 
Note: See TracChangeset for help on using the changeset viewer.