public XWPFDocument Render(USFMDocument input) { UnrenderableMarkers = new List <string>(); CrossRefMarkers = new Dictionary <string, Marker>(); newDoc = new XWPFDocument(); if (FrontMatter != null) { RenderFrontMatter(FrontMatter); } if (configDocx.renderTableOfContents) { DocumentStylesBuilder.BuildStylesForTOC(newDoc); RenderTOC(); } newDoc.CreateFootnotes(); setStartPageNumber(); newDoc.ColumnCount = configDocx.columnCount; foreach (Marker marker in input.Contents) { RenderMarker(marker, new StyleConfig()); } // Add section header for final book if (previousBookHeader != null) { createBookHeaders(previousBookHeader); } // Make final document section continuous so that it doesn't // create an extra page at the end. Final section is unique: // it's a direct child of the document, not a child of the last // paragraph. CT_SectPr finalSection = new CT_SectPr(); finalSection.type = new CT_SectType(); finalSection.type.val = ST_SectionMark.continuous; newDoc.Document.body.sectPr = finalSection; finalSection.cols.num = configDocx.columnCount.ToString(); CT_PageNumber pageNum = new CT_PageNumber { fmt = ST_NumberFormat.@decimal }; finalSection.pgNumType = pageNum; return(newDoc); }
/// <summary> /// Creates a new section with the given page header. Must be /// called *after* the final paragraph of the section. In DOCX, a /// section definition is a child of the final paragraph of the /// section, except for the final section of the document, which /// is a direct child of the body. /// </summary> /// <param name="bookname"> The name of the book to display, usually from the \h marker </param> public void createBookHeaders(string bookname) { // Create page heading content for book CT_Hdr header = new CT_Hdr(); CT_P headerParagraph = header.AddNewP(); CT_PPr ppr = headerParagraph.AddNewPPr(); CT_Jc align = ppr.AddNewJc(); align.val = ST_Jc.center; CT_R run = headerParagraph.AddNewR(); // Show page numbers if requested if (configDocx.showPageNumbers) { // Page number run.AddNewFldChar().fldCharType = ST_FldCharType.begin; run.AddNewInstrText().Value = " PAGE "; run.AddNewFldChar().fldCharType = ST_FldCharType.separate; run.AddNewInstrText().Value = "1"; run.AddNewFldChar().fldCharType = ST_FldCharType.end; run.AddNewT().Value = " - "; } // Book name run.AddNewT().Value = bookname == null ? "" : bookname; // Chapter name if (currentChapterLabel.Length > 0) { run.AddNewT().Value = " - "; run.AddNewT().Value = currentChapterLabel; } // Create page header XWPFHeader documentHeader = (XWPFHeader)newDoc.CreateRelationship(XWPFRelation.HEADER, XWPFFactory.GetInstance(), pageHeaderCount); documentHeader.SetHeaderFooter(header); // Create new section and set its header CT_SectPr newSection = newDoc.Document.body.AddNewP().AddNewPPr().createSectPr(); newSection.type = new CT_SectType(); newSection.type.val = ST_SectionMark.continuous; CT_HdrFtrRef headerRef = newSection.AddNewHeaderReference(); headerRef.type = ST_HdrFtr.@default; headerRef.id = documentHeader.GetPackageRelationship().Id; // Set number of columns newSection.cols.num = configDocx.columnCount.ToString(); // Set page numbers CT_PageNumber pageNum = new CT_PageNumber { fmt = ST_NumberFormat.@decimal }; newSection.pgNumType = pageNum; // Increment page header count so each one gets a unique ID pageHeaderCount++; }