【发布时间】:2010-10-01 14:44:16
【问题描述】:
我需要在浏览器在一段文本中自然添加换行符的位置添加换行符。
例如:
这是一段很长的文本\n,跨越段落中的多行。
这是浏览器选择在\n
的位置分断的段落我需要找到这个位置并插入一个
有没有人知道任何能够做到这一点的 JS 库或函数?
到目前为止,我发现的唯一解决方案是从段落中删除标记并观察 clientHeight 属性以检测元素高度的变化。我没有时间完成这个,想找一些已经测试过的东西。
编辑: 我需要这样做的原因是我需要准确地将 HTML 转换为 PDF。 Acrobat 呈现的文本比浏览器更窄。这会导致文本在不同位置中断。我需要在转换后的 PDF 中具有相同的参差不齐的边缘和相同的行数。
编辑:
@dtsazza:感谢您深思熟虑的回答。生成一个几乎完全复制我编写的 99% 的 HTML 的布局编辑器并非不可能;)
我正在开发的应用程序允许用户通过拖动“磁贴”来创建产品目录。磁贴是固定宽度、绝对定位的包含图像和文本的 div。所有元素都有样式,因此字体大小是固定的。我在段落中查找 \n 的解决方案在 80% 的情况下都可以,并且当它与给定的段落一起使用时,生成的 PDF 非常接近屏幕上的版本,因此差异并不重要。段落的高度相同(到像素),图像被替换为高分辨率版本,所有位图作品被替换为服务器端生成的 SVG。
我的 HTML 和 PDF 之间唯一的轻微区别是 Acrobat 呈现的文本稍微更窄,这导致行的行长略短。
Diodeus 的添加跨度并找到它们的坐标的解决方案非常好,应该给我 BR 的位置。请记住,用户永远不会看到插入了 BR 的 HTML - 添加这些 BR 是为了使 PDF 转换产生一个大小完全相同的段落。
很多人似乎认为这是不可能的。我已经有一个可以工作的应用程序,它为我们的文档创建了 非常 准确的 HTML->PDF 转换 - 我只需要一个更好的添加 BR 的解决方案,因为我的解决方案有时会错过一个 BR。顺便说一句,当它确实有效时,我的段落与 HTML 等价物的高度相同,这是我们所追求的结果。
如果有人对我正在转换的文档类型感兴趣,那么您可以查看此截屏视频:
http://www.localsa.com.au/brochure/brochure.html
编辑:非常感谢 Diodeus - 您的建议是正确的。
解决方案: 对于我的情况,将单词包装在 span 而不是空格中更有意义。
var text = paragraphElement.innerHTML.replace(/ /g, ' ');
text = ""+text+""; //包装第一个和最后一个单词。
这会将每个单词包装在一个跨度中。我现在可以查询文档以获取所有单词,迭代并比较 y 位置。当 y pos 改变时添加一个 br。
这完美无缺,并为我提供了我需要的结果 - 谢谢!
【问题讨论】:
-
你能解释一下为什么你需要 br 的吗?换行符是一种渲染特性,它与字体和屏幕大小有关。此外,如果您调整窗口大小,换行符可能会在其他地方。
-
你可能会遇到一些问题,因为如果这个人改变了字体大小,那么你的休息时间可能会落在奇怪的地方
-
我需要将 HTML 准确地转换为 PDF。字体在 PDF 中呈现稍窄,这会导致文本在转换时在不同位置中断。
-
您能解释一下保留粗糙边缘的重要性吗?
-
这只是项目的要求。我正在开发一个 HTML/JS 小册子设计器。最终产品 (PDF) 需要与屏幕上的版本相匹配。
标签: javascript html