meteor-pdfkit icon indicating copy to clipboard operation
meteor-pdfkit copied to clipboard

Question:chinese display in pdfkit

Open hanmeimei2016 opened this issue 9 years ago • 1 comments

Hello, I am using pdfkit to generate PDF in nodejs project, but the latter part of Chinese in pdf turn into white squares or missing with different font when read in a mobile phone browsing or in Adobe PDF.It is strange that using the PC web browser like Google Chrome is okay. What is more, when I comment some front code ,namely delete the front part of Chinese, white squares turn into Chinese. Looking forward to your reply. Thank you!

`"use strict"; var PDFDocument = require('pdfkit'); var blobStream = require('blob-stream'); var fs = require('fs');

var pTitileX = cm2px(6.2); var pTitileY = cm2px(1.8); var leftRightSpace = cm2px(0.9); var frame = { w: 612 - leftRightSpace * 2, h: 680, vticalH1: cm2px(0.9), vticalH2: cm2px(1.3) }; var p00 = { x: leftRightSpace, y: cm2px(3.15) }; var p08 = { x: leftRightSpace, y: 325 }; var p09 = { x: leftRightSpace, y: 340 };

var p018 = { x: leftRightSpace, y: 660 };

var p019 = { x: leftRightSpace, y: 700 };

var p020 = { x: leftRightSpace, y: p00.y + frame.h };

var vvMark = { a1: leftRightSpace + cm2px(5), a2: leftRightSpace + cm2px(8), a3: leftRightSpace + cm2px(10.25), a4: leftRightSpace + cm2px(12.25), a5: leftRightSpace + cm2px(14.25), a6: leftRightSpace + cm2px(15.5), a7: leftRightSpace + cm2px(16.2) };

var vvTemp = 3; var vvTextMark = { a0: leftRightSpace + vvTemp, a1: leftRightSpace + vvTemp + cm2px(5), a2: leftRightSpace + vvTemp + cm2px(8), a3: leftRightSpace + vvTemp + cm2px(10.25), a4: leftRightSpace + vvTemp + cm2px(12.25), a5: leftRightSpace + vvTemp + cm2px(14.25), a6: leftRightSpace + vvTemp + cm2px(15.5), a7: leftRightSpace + vvTemp + cm2px(16.2) };

var ttMark = { a0: leftRightSpace + vvTemp, a1: leftRightSpace + cm2px(1.6), a2: leftRightSpace + cm2px(3.8), a3: leftRightSpace + cm2px(7.8), a4: leftRightSpace + cm2px(10.2), a5: leftRightSpace + cm2px(13.5), a6: leftRightSpace + cm2px(15.2), a7: leftRightSpace + cm2px(16.8), a8: leftRightSpace + cm2px(17.9) };

module.exports = { // 获取 get: function (req, res, next) { res.header('content-type', 'application/pdf'); res.write('

'); var doc = new PDFDocument(); doc.page.width = 612; doc.page.height = 792;
                var stream = doc.pipe(blobStream());

                //边框
                doc.lineWidth(1.5)
                          .lineJoin('bevel')
                          .undash()
                          .rect(p00.x, p00.y, frame.w, frame.h)
                          .stroke();

                //1-7线条
                for (var i = 0; i < 8; i++) {
                          doc
                                    .moveTo(p00.x, p00.y + i * frame.vticalH1)
                                    .lineTo(p00.x + frame.w, p00.y + i * frame.vticalH1)
                                    .lineWidth(1)
                                    .undash()
                                    .stroke();
                }

                //p08
                doc
                          .lineWidth(1)
                          .moveTo(p08.x, p08.y)
                          .lineTo(p08.x + frame.w, p08.y)
                          .stroke();

                //9-17线条
                for (var i = 0; i < 9; i++) {
                          if (i >= 1 && i <= 7) {
                                    doc
                                              .moveTo(p09.x, p09.y + i * frame.vticalH2)
                                              .lineTo(p09.x + frame.w, p09.y + i * frame.vticalH2)
                                              .lineWidth(0.5)
                                              .dash(1, 1)
                                              .stroke();
                          } else {
                                    doc
                                              .moveTo(p09.x, p09.y + i * frame.vticalH2)
                                              .lineTo(p09.x + frame.w, p09.y + i * frame.vticalH2)
                                              .lineWidth(1)
                                              .undash()
                                              .stroke();
                          }
                }

                doc
                          .moveTo(p018.x, p018.y)
                          .lineTo(p018.x + frame.w, p018.y)
                          .lineWidth(1)
                          .undash()
                          .stroke();

                //上部竖向线条
                doc
                          .moveTo(vvMark.a1, p1to7(3))
                          .lineTo(vvMark.a1, p1to7(7))
                          .moveTo(vvMark.a2, p1to7(0))
                          .lineTo(vvMark.a2, p1to7(3))
                          .moveTo(vvMark.a2, p1to7(4))
                          .lineTo(vvMark.a2, p1to7(6))
                          .moveTo(vvMark.a3, p1to7(1))
                          .lineTo(vvMark.a3, p1to7(2))
                          .moveTo(vvMark.a3, p1to7(3))
                          .lineTo(vvMark.a3, p1to7(4))
                          .moveTo(vvMark.a4, p1to7(0))
                          .lineTo(vvMark.a4, p1to7(1))
                          .moveTo(vvMark.a4, p1to7(2))
                          .lineTo(vvMark.a4, p1to7(3))
                          .moveTo(vvMark.a4, p1to7(4))
                          .lineTo(vvMark.a4, p1to7(6))
                          .moveTo(vvMark.a4, p1to7(4))
                          .lineTo(vvMark.a4, p1to7(6))
                          .moveTo(vvMark.a5, p1to7(1))
                          .lineTo(vvMark.a5, p1to7(2))
                          .moveTo(vvMark.a6, p1to7(2))
                          .lineTo(vvMark.a6, p1to7(6))
                          .moveTo(vvMark.a7, p1to7(0))
                          .lineTo(vvMark.a7, p1to7(1))
                          .lineWidth(1)
                          .undash()
                          .stroke();

                doc
                          .moveTo(p019.x, p019.y)
                          .lineTo(vvMark.a1, p019.y)
                          .lineTo(vvMark.a1, p018.y)
                          .lineWidth(1)
                          .undash()
                          .stroke();

                doc
                          .moveTo(vvMark.a4, p018.y)
                          .lineTo(vvMark.a4, p020.y)
                          .lineWidth(1)
                          .undash()
                          .stroke();

                doc
                          .fontSize(18)
                          .font(__dirname + '/simhei.ttf')
                          .text('中华人民共和国海关出口货物报关单', pTitileX, pTitileY)
                          .stroke();
                doc
                          .fontSize(9)
                          .font(__dirname + '/Deng.ttf')
                          .text('预录入编号:', 90, cm2px(2.7))
                          .text('海关编号:', 310, cm2px(2.7))
                          .text('收发货人', vvTextMark.a0, textP1to7(0))
                          .text('出口口岸', vvTextMark.a2, textP1to7(0))
                          .text('出口日期', vvTextMark.a4, textP1to7(0))
                          .text('申报日期', vvTextMark.a7, textP1to7(0))
                          .text('生产销售单位', vvTextMark.a0, textP1to7(1))
                          .text('运输方式', vvTextMark.a2, textP1to7(1))
                          .text('运输工具名称', vvTextMark.a3, textP1to7(1))
                          .text('提运单号', vvTextMark.a5, textP1to7(1))
                          .text('申报单位', vvTextMark.a0, textP1to7(2))
                          .text('监管方式', vvTextMark.a2, textP1to7(2))
                          .text('征免性质', vvTextMark.a4, textP1to7(2))
                          .text('备案号', vvTextMark.a6, textP1to7(2))
                          .text('贸易国(地区)', vvTextMark.a0, textP1to7(3))
                          .text('运抵国(地区)', vvTextMark.a1, textP1to7(3))
                          .text('指运港', vvTextMark.a3, textP1to7(3))
                          .text('境内货源地', vvTextMark.a6, textP1to7(3))
                          .text('许可证号', vvTextMark.a0, textP1to7(4))
                          .text('成交方式', vvTextMark.a1, textP1to7(4))
                          .text('运费', vvTextMark.a2, textP1to7(4))
                          .text('保费', vvTextMark.a4, textP1to7(4))
                          .text('杂费', vvTextMark.a6, textP1to7(4))
                          .text('合同协议号', vvTextMark.a0, textP1to7(5))
                          .text('件数', vvTextMark.a1, textP1to7(5))
                          .text('包装种类', vvTextMark.a2, textP1to7(5))
                          .text('毛重(千克)', vvTextMark.a4, textP1to7(5))
                          .text('净重(千克)', vvTextMark.a6, textP1to7(5))
                          .text('集装箱号', vvTextMark.a0, textP1to7(6))
                          .text('随附单证', vvTextMark.a1, textP1to7(6))
                          .text('标记唛码及备注', vvTextMark.a0, textP1to7(7))
                          .text('项号', vvTextMark.a0, p08.y + 3)
                          .text('商品编号', ttMark.a1, p08.y + 3)
                          .text('商品名称、规格型号', ttMark.a2, p08.y + 3)
                          .text('数量及单位', ttMark.a3, p08.y + 3)
                          .text('最终目的国(地区)', ttMark.a4, p08.y + 3)
                          .text('单价', ttMark.a5, p08.y + 3)
                          .text('总价', ttMark.a6, p08.y + 3)
                          .text('币制', ttMark.a7, p08.y + 3)
                          .text('征免', ttMark.a7, p08.y + 3)
                          .text('录入员', vvTextMark.a0, p018.y + 3)
                          .text('录入单位', 100, p018.y + 3)
                          .text('兹申明对以上内容承担如实申报、依法纳税之', vvTextMark.a1, p018.y + 3)
                          .text('海关批注及签章', vvTextMark.a4, p018.y + 3)
                          .text('法律责任', vvTextMark.a4, p018.y + 23)
                          .text('报关人员', vvTextMark.a0, p018.y + 43)
                          .text('申报单位(签章)', vvTextMark.a4, p018.y + 43)
                          .stroke();

                doc.end();
                doc.pipe(res);
      }

};

function p1to7(n) { return p00.y + n * frame.vticalH1; } function p10to17(n) { return p09.y + n * frame.vticalH2; }

function textP1to7(n) { return p00.y + n * frame.vticalH1 + 3; }

function cm2px(value) { return (value * 612 / 21.587); }`

hanmeimei2016 avatar Aug 01 '16 07:08 hanmeimei2016

You can make a PR if you have found a solution.

pascoual avatar Jan 15 '17 17:01 pascoual