【发布时间】:2018-02-21 04:37:24
【问题描述】:
我正在尝试对 jsPDF 库应用一些更改,以便能够证明文本的合理性。
我很难找到 Tw(字间距)的正确值。
在jspdf.js (L:1413) 我添加了这个代码:
if (align) {
...
else if (align === 'justify') {
left = x;
}
else {
throw new Error('Unrecognized alignment option, use "center" or "right".');
}
prevX = x;
text = '(' + da[0];
let pdfPageWidth = this.internal.pageSize.width;
let wordSpacing;
if( align === 'justify' ) {
let fontSize = this.internal.getFontSize();
let nWords = da[0].trim().split(/\s+/).length;
let textWidth = this.getStringUnitWidth(da[0].replace(/\s+/g, '')) / this.internal.scaleFactor;
wordSpacing = (Math.max(0, (pdfPageWidth - textWidth) / Math.max(1, nWords - 1));
wordSpacing += ' Tw\n';
text = wordSpacing + text;
}
...
}
这个想法是通过执行 (pageWidth - textWidth) / numberOfWords -1 来提取空间宽度。我无法获得正确的单词空间。
输出示例
BT
/F1 16 Tf
18.4 TL
0 g
28.35 756.85 Td
19.00357142857142 Tw
(And a little bit it adélkfjalké.) Tj
ET
是否存在编码问题?
感谢您的帮助。
【问题讨论】:
-
使用哪种字体编码?根据规范“当使用将代码32定义为单字节代码的简单字体或复合字体时,应将字间距应用于字符串中每个出现的单字节字符代码32。不应适用于多字节代码中出现的字节值 32。" 如果您的编码不将空格字形编码为单个字节 0x20,则不会按需要应用字间距。
-
我也在 pdfkit 库上找到了这条评论。我正在使用 utf-8,但我不知道如何将其设为 32。
-
UTF-8 不是正确的 PDF 字体编码。您应该检查当前 PDF 字体的编码。如果是例如纯两字节编码(例如 Identity-H),不能使用字间距。
-
抱歉,我对 PDF 了解不多,这是 jsPDF 中指定的内容:“由于 Adobe 专注于“您的字体子集!”您不应该拥有映射的字体直接将Unicode(UCS2 / UTF16BE)代码转换为字体GID,但您可以使用“Identity-H”编码和模仿Unicode代码页的自定义CIDtoGID映射来伪造它。但是,流中的所有字符都被视为GID,包括BOM ,这就是我们需要在内容文本中跳过 BOM 的原因(即与字体相关联的 BOM)。”
-
Identity-H 是纯 16 位编码。因此,不应用字间距。
标签: javascript pdf jspdf