+ async putText(doc : PDFKit.PDFDocument, box : Box, styleCache : TextStyle,
+ fontPairCache : fontPathPSNamePair):
+ Promise<[PDFKit.PDFDocument, TextStyle, fontPathPSNamePair]>{
+ var fontPair;
+
+
+ if (box.textStyle !== null){
+
+ if(box.textStyle == styleCache){
+ fontPair = fontPairCache;
+ }else{
+ fontPair = fontStyleTofont(box.textStyle);
+ styleCache = box.textStyle;
+ fontPairCache = fontPair;
+
+ if (fontPair.path.match(/\.ttc$/g)){
+ doc
+ .font(fontPair.path, fontPair.psName)
+ .fontSize(box.textStyle.size * 0.75);}
+ else{
+ doc
+ .font(fontPair.path)
+ .fontSize(box.textStyle.size * 0.75); // 0.75 must added!
+ }
+ }
+
+ if (box.textStyle.color !== undefined){
+ doc.fill(box.textStyle.color);
+ }
+
+ if (Array.isArray(box.content)){
+ for (var k=0; k<box.content.length; k++){
+
+ let tmp = await this.putText(doc, box.content[k], styleCache, fontPairCache);
+ doc = tmp[0];
+ styleCache = tmp[1];
+ fontPairCache = tmp[2];
+ }
+ }else if (box.content !== null){
+ await doc.text(box.content,
+ (box.x!==null? box.x: undefined),
+ (box.y!==null? box.y: undefined));
+ }
+
+ }
+
+
+ return [doc, styleCache, fontPairCache];
+ };
+
+
+
+ private grid(doc: any) {
+ for (var j = 0; j < A4_IN_PX.width; j += 5) {
+ if (j % 50 == 0) {
+ doc.save().fill('#000000')
+ .fontSize(8).text(j.toString(), j*0.75, 50);
+
+ doc
+ .save()
+ .lineWidth(0.4)
+ .strokeColor("#dddddd")
+ .moveTo(j*0.75, 0)
+ .lineTo(j*0.75, 1000)
+ .stroke();
+ }
+
+ doc
+ .save()
+ .lineWidth(0.2)
+ .strokeColor("#dddddd")
+ .moveTo(j*0.75, 0)
+ .lineTo(j*0.75, 1000)
+ .stroke();
+ }
+
+ for (var i = 0; i < 1050; i += 5) {
+ if (i % 50 == 0) {
+ doc.save()
+ .fontSize(8).text(i.toString(), 50, i*0.75);
+
+ doc
+ .save()
+ .lineWidth(0.4)
+ .strokeColor("#bbbbbb")
+ .moveTo(0, i*0.75)
+ .lineTo(1000, i*0.75)
+ .stroke();
+ }
+ doc
+ .save()
+ .lineWidth(0.2)
+ .strokeColor("#bbbbbb")
+ .moveTo(0, i*0.75)
+ .lineTo(1000, i*0.75)
+ .stroke();
+ }
+ doc
+ .save()
+ .moveTo(0, 200)
+ .lineTo(1000, 200)
+ .fill('#FF3300');
+ }
+
+ /**
+ * make all the nest boxes's position fixed
+ * @param box the main boxes
+ * @returns the fixed boxes
+ */
+ fixenBoxesPosition(box : Box) : Box{
+ var currX : number = (box.x!==null?box.x:0); // current x
+ var currY : number =(box.y!==null?box.y:0); // current y
+ if (Array.isArray(box.content)){
+ for (var i=0; i<box.content.length; i++){
+ if (box.direction == Direction.LTR){
+ box.content[i].x = currX;
+ box.content[i].y = currY;
+ let elementWidth = box.content[i].width;
+ if(elementWidth !== null){
+ currX += elementWidth;
+ }
+
+ }
+ if (box.direction == Direction.TTB){
+ box.content[i].x = currX;
+ box.content[i].y = currY;
+ let elementHeight = box.content[i].height;
+ if(elementHeight !== null){
+ currY += elementHeight;
+ }
+
+ }
+
+
+ box.content[i] = this.fixenBoxesPosition(box.content[i]);
+ }
+ }
+
+ return box;
+ }
+
+ /**
+ * input a `segmentedNodes` and a layed `frame`, return a big `Box` that nodes is put in.
+ * @param segmentedNodes the segmentnodes to be input
+ * @param frame the frame to be layed out.
+ * @returns the big `Box`.
+ */