def makeLogo(): doc = Document(w=W, h=W, autoPages=1) for frame in range(FRAMES): page = doc.newPage() x = int(round(random()*(W-4*LINE))) y = int(round(random()*(H-4*LINE))) w = h = 4*LINE newRect(x=x, y=y, w=w, h=h, parent=page, style=dict(strokeWidth=LINE, stroke=0, fill=None)) return doc
def makeDocument(): u"""Demo Bitcount Reference composer.""" # Set some values of the default template (as already generated by the document). # Make squential unique names for the flow boxes inside the templates coverTitleId = 'coverTitleId' # To find the placement of the cover title. coverAuthorId = 'coverAuthorId' # Find the placement for the author name. tocId = 'toc' # Id of target textBox, containing the table of content. flowId1 = MAIN_FLOW + '1' flowIds = [flowId1] # Names of boxes that contain footnote text in flow. footnotesId = 'footnotes' # Id of target textBox containing footnotes per page. literatureIndexId = 'literatureIndex' imageIndexId = 'imageIndex' pageNumberId = 'pageNumberId' # Template for Cover page templateCover = Template() # Create new template newColTextBox(0, 0, w=W, h=H, fill=(1, 0, 0), parent=templateCover) # Placement of first <h1> in the Galley, holding the Thesis title. newColTextBox('Title of the page', 1, 1, 6, 5, eId=coverTitleId, fill=BOX_COLOR, parent=templateCover) # Placement of first <h4> in the Galley, holding the author name(s) newColTextBox('Subhead of the page', 1, 8, 6, 5, eId=coverAuthorId, fill=BOX_COLOR, parent=templateCover) # Template for Table of Content templateToc = Template() # Create template for Table of Content newColTextBox('\nTable of Content', 3, 0, 4, 1, fill=BOX_COLOR, fontSize=32, parent=templateToc) newColTextBox('', 3, 1, 4, 8, eId=tocId, fill=BOX_COLOR, parent=templateToc) # Template for literature reference index. templateLiteratureIndex = Template( ) # Create template for Table of Content newColTextBox('\nLiterature index', 3, 0, 4, 1, fill=BOX_COLOR, fontSize=32, parent=templateLiteratureIndex) newColTextBox('', 3, 1, 4, 8, eId=literatureIndexId, fill=BOX_COLOR, parent=templateLiteratureIndex) # Template for image reference index. templateImageIndex = Template() # Create template for Table of Content newColTextBox('\nImage index', 3, 0, 4, 1, fill=BOX_COLOR, fontSize=32, parent=templateImageIndex) newColTextBox('', 3, 1, 4, 8, eId=imageIndexId, fill=BOX_COLOR, parent=templateImageIndex) # Template 1 template1 = Template() # Create template of main size. Front page only. # Create empty image place holders. To be filled by running content on the page. # In this templates the images fill the left column if there is a reference on the page. newColPlacer(0, 0, 3, 3, parent=template1) # Empty image element, cx, cy, cw, ch newColPlacer(0, 3, 3, 3, parent=template1) newColPlacer(0, 6, 3, 3, parent=template1) # Create linked text boxes. Note the "nextPage" to keep on the same page or to next. newColTextBox('ABC', 3, 0, 4, 9, eId=flowId1, nextBox=flowId1, nextPage=1, fill=BOX_COLOR, parent=template1) newColTextBox('', 3, 9, 3, 2, eId=footnotesId, fill=BOX_COLOR, parent=template1) # Create page number box. Pattern pageNumberMarker is replaced by FormattedString of actual page number. # Mark the text box, so we can find it back later. newColTextBox(['pageIdMarker'], 6, 9, 1, 1, eId=pageNumberId, font=BOOK, fontSize=12, fill=BOX_COLOR, xAlign=RIGHT, parent=template1) # Create new document with (w,h) and fixed amount of pages. # Make number of pages with default document size. # Initially make all pages default with template2 doc = Document(autoPages=5, template=template1) rs = doc.getRootStyle() rs['openTypeFeatures'] = dict(zero=Slashed_Zero, smcp=Smallcaps, c2sc=Caps_As_Smallcaps, ss08=Italic_Shapes, ss07=Condensed, ss01=Extended_Ascenders, ss02=Extended_Capitals, ss03=Extended_Descenders, ss04=Contrast_Pixel, ss09=Alternative_g, onum=LC_Figures) # Cache some values from the root style that we need multiple time to create the tag styles. fontSize = rs['fontSize'] leading = rs['leading'] rLeading = rs['rLeading'] listIndent = rs['listIndent'] language = rs['language'] # Add styles for whole document and text flows. # Note that some values are defined here for clarity, even if their default root values # are the same. doc.newStyle(name='chapter', font=BOOK) doc.newStyle(name='title', fontSize=3 * fontSize, font=BOLD) doc.newStyle(name='subtitle', fontSize=2.6 * fontSize, font=BOOK_ITALIC) doc.newStyle(name='author', fontSize=2 * fontSize, font=BOOK, fill=(1, 0, 0)) doc.newStyle(name='h1', fontSize=7 * fontSize, font=SEMIBOLD_CONDENSED, fill=(1, 0, 0), leading=7.2 * fontSize, tracking=H1_TRACK, prefix='', postfix='\n') doc.newStyle(name='h2', fontSize=1.5 * fontSize, font=SEMIBOLD_CONDENSED, fill=0, leading=1.6 * fontSize, rLeading=0, rTracking=H2_TRACK, prefix='\n', postfix='\n', paragraphTopSpacing=U) doc.newStyle(name='h3', fontSize=1.1 * fontSize, font=MEDIUM, fill=0, paragraphTopSpacing=2 * U, paragraphBottomSpacing=U, leading=leading, rLeading=0, rNeedsBelow=2 * rLeading, rTracking=H3_TRACK, prefix='\n', postfix='\n') doc.newStyle(name='h4', fontSize=1.1 * fontSize, font=BOOK, fill=0, leading=leading, rLeading=0, rNeedsBelow=2 * rLeading, rTracking=H3_TRACK, paragraphTopSpacing=U, paragraphBottomSpacing=U, prefix='\n', postfix='\n') # Spaced paragraphs. doc.newStyle( name='p', fontSize=fontSize, font=BOOK, fill=0.1, prefix='', postfix='\n', rTracking=P_TRACK, leading=14, rLeading=0, xAlign=LEFT, hyphenation=True, indent=0, firstLineIndent=2 * U, firstParagraphIndent=0) # TODO: Make firstParagraphIndent to work. # Inline tags need to refined prefix and postfix as non-\n, otherwise they # will inherit these attributes from the parent <p> doc.newStyle(name='b', font=SEMIBOLD, prefix='', postfix='') doc.newStyle(name='em', font=BOOK_ITALIC, textFill=(1, 0, 0), prefix='', postfix='') doc.newStyle(name='hr', stroke=(1, 0, 0), strokeWidth=4) doc.newStyle(name='br', postfix='\n') # Simplest way to make <br/> show newline doc.newStyle(name='a', prefix='', postfix='') # Literature reference. doc.newStyle(name='literatureref', textFill=0.3, fontSize=fontSize - 1) # Footnote reference index. doc.newStyle(name='sup', font=MEDIUM, baselineShift=2, prefix='', postfix=' ', fontSize=fontSize - 2) doc.newStyle( name='li', fontSize=fontSize, font=BOOK, rTracking=P_TRACK, leading=leading, hyphenation=True, # Lists need to copy the listIndex over to the regalar style value. tabs=[(listIndent, LEFT)], indent=listIndent, firstLineIndent=1, postfix='\n') doc.newStyle(name='ul', prefix='', postfix='') doc.newStyle(name='footnote', fill=0, fontSize=0.9 * fontSize, font=BOOK, rTracking=P_TRACK, tabs=[(listIndent, LEFT)], indent=listIndent, firstLineIndent=1, postfix='\n') # Image & captions doc.newStyle( name='img', stroke=0.3, fill=None, rTracking=P_TRACK, language=language, textFill=0.2, strokeWidth=1, leading=leading * 0.8, fontSize=0.8 * fontSize, font=BOOK_ITALIC, hyphenation=True, indent=0, firstLineIndent=0, # Use style['fill'] = transparant color as overlay on image. ) # Generic document layout # Page 1 Cover # Page 2 Title # Page 3 Table of Content # Page 4+ Content (footnotes are shown on the page of their reference) # Page -1 Alphabetical literature reference. # Change template of cover page. # Create filtered Galley for cover page. # See https://docs.python.org/2/library/xml.etree.elementtree.html#xpath-support # for XPath filter syntax. gTitle = Galley() t = Typesetter(doc, gTitle) #t.typesetFile(MD_PATH, style=dict(textFill=1, fontSize=80, font=MEDIUM, leading=84), # xPath='h1') gAuthor = Galley() t = Typesetter(doc, gAuthor) #t.typesetFile(MD_PATH, style=dict(textFill=1, fontSize=24, font=MEDIUM), # xPath='h4') # First one is the author coverPage = doc[1] coverPage.applyTemplate(templateCover) c = Composer(doc) #c.compose(gTitle, coverPage, coverTitleId) #c.compose(gAuthor, coverPage, coverAuthorId) # Change template of Table of Content page tocPage = doc[2] tocPage.applyTemplate(templateToc) mainPage = doc[3] # Create main Galley for this page, for pasting the sequence of elements. g = Galley() t = Typesetter(doc, g) t.typesetFile(MD_PATH) # Fill the main flow of text boxes with the ML-->XHTML formatted text. c = Composer(doc) c.compose(g, mainPage, flowId1) # Now all text is composed on pages, scan for the pages that contain footnotes. # TODO: This will be implemented a function inside Composer in a later version. # Assume the tocBox (Table of Content) to be available on the first page. literatureRefs = {} tocBox, (_, _) = tocPage[tocId] for pageId, page in sorted(doc.pages.items()): if page in (tocPage, coverPage): # Skip these for toc collect and footnotes. continue # Get page box for footnotes fnBox, (_, _) = page[footnotesId] assert fnBox is not None # Otherwise there is a template error. Footnote box needs to exist. for flowId in flowIds: # BUG: Need to check if the marker was really found in the textbox area. # If it is part of the overflow, then it should not be found here. flow, _ = page[flowId] for marker, arguments in findMarkers(flow.fs): if marker == 'footnote': footNoteIsInOverflow = False # Process the foot note. footnoteId = int(arguments) # Footnode ids are numbers. # @@@ Hack to check if the marker is in the overflow text. # In that case, ignore it. for overFlowMarker, overFlowArguments in findMarkers( flow.getOverflow()): # If this marker is a footnote and one that we are looking for, # we can ignore it, because it is in the overflow part of the flow.fs if overFlowMarker == 'footnote' and footnoteId == int( overFlowArguments): footNoteIsInOverflow = True break if not footNoteIsInOverflow: # We found a footnote that is visible on this page and # not in one of the overflow texts. # Process the footnote id and content, usng the “footnote“ content style. # We are re-using the typesetter here. This may become a separate typesetter, if this code # becomes a method of the composer. # TODO: Make this into Galley, in case footnote <p> has child nodes. footnoteText = doc.context.newString( '%d\t%s\n' % (footnoteId, doc.footnotes[footnoteId]['p'].text), page, t.getCascadedStyle(doc.getStyle('footnote'))) # Add the footnote content to the box (it may not be the first to be added. fnBox.append(footnoteText) elif marker in ('h1', 'h2', 'h3', 'h4'): # For now we want them all in the TOC #doc.addToc(marker) pass elif marker == 'literature': # The "arguments" contains the refId, so we can find it in the collected literature references # and then add this page number. # @@@ TODO: check if reference marker is in overflow. Then ignore processing it. doc.literatureRefs[int(arguments)]['pageIds'].append( pageId) # Build the alphabetical literature reference page. # Scan the created pages for literature references and build an index on a new page. literatureIndexPage = doc.newPage(template=templateLiteratureIndex) # Make an alfabetic sorted list of name-->(reference, (pageNumber, ...)) references = {} for refIndex, item in doc.literatureRefs.items(): references[item['nodeId']] = item literatureRefBox = literatureIndexPage.getElement(literatureIndexId) for refId, item in sorted(references.items()): # Now we have a sorted list of reference items, we need to make it into a galley. # Several ways of doing it: Create MarkDown, HTML/XML or directly writing FormattedText. pageNumbers = [] for pageNumber in item['pageIds']: pageNumbers.append( ` pageNumber `) literatureRefBox.append(u'%s – %s\n' % (refId, ', '.join(pageNumbers))) print refId, item['nodeId'], item['node'], item['p'], item['pageIds'] # Build the alphabetical image reference page. # Scan the created pages for image references and build an index on a new page. imageIndexPage = doc.newPage(template=templateImageIndex) # Make an alfabetic sorted list of name-->(reference, (pageNumber, ...)) references = {} for refIndex, item in doc.imageRefs.items(): references[item['nodeId']] = item for imageRefId, item in sorted(references.items()): print imageRefId, item['nodeId'], item['node'], item['p'], item[ 'pageIds'] # Set all pagenumbers and other page-based info for pageId, page in sorted(doc.pages.items()): for e in page.elements: if e.eId == pageNumberId: e.setText('%s' % pageId) break return doc
tb = newTextBox(overflowText, name=cId2, parent=page, ml=page.gw, mt=16, mb=16, x=24, y=20, fill=0, fontSize=fontSize, w=page.pw * 2 / 3, conditions=[Float2Right(), Float2Top(), Fit2Bottom()]) #print he.x, he.y page.solve() if not tb.isOverflow(): break overflowText = tb.getOverflow() pn += 1 doc.newPage() # TODO: This should work: get the last page in a doc. page = doc[pn] page.padding = int(page.h / 12), int(page.w / 12) #print he.x, he.y doc.export('_export/TextAssignment.pdf')