如何找到浏览器中断文本段落的位置

时间:2009-01-15 14:36:36

标签: javascript html

我需要在浏览器自然地在文本段落中添加换行符的位置添加换行符。

例如:

< p>这是一段很长的文字 \ n ,它跨越段落中的多行。< / p>

这是浏览器选择在 \ n

位置处中断的段落

我需要找到这个位置并插入< br />

是否有人知道任何能够执行此操作的JS库或函数?

到目前为止,我发现的唯一解决方法是从段落中删除令牌并观察clientHeight属性以检测元素高度的变化。我没有时间完成这项工作,并希望找到已经测试过的东西。

修改 我需要这样做的原因是我需要准确地将HTML转换为PDF。 Acrobat呈现的文本比浏览器更窄。这导致文本在不同位置中断。我需要一个相同的参差不齐的边缘和转换后的PDF中相同数量的行。

修改

@dtsazza:谢谢你的回答。制作几乎完全复制HTML的布局编辑器并不是不可能的,我编写了99%的HTML;)

我正在处理的应用程序允许用户通过拖动“图块”来创建产品目录图块是固定宽度,绝对定位的div包含图像和文本。所有元素都有样式,因此字体大小是固定的。在段落中找到\ n的解决方案在80%的时间都是正常的,当它与给定的paragrah一起使用时,生成的PDF与屏幕上的版本非常接近,差异无关紧要。段落的高度(与像素相同),图像被高分辨率版本替换,所有位图图稿都被SVG生成的服务器端替换。

我的HTML和PDF之间唯一的轻微的区别在于,Acrobat稍微渲染文字,导致线条的线条长度略短。

Diodeus增加跨度并找到它们的坐标的解决方案非常好,应该给我BR的位置。请记住,用户永远不会看到带有插入的BR的HTML - 这些是添加的,以便PDF转换生成一个大小完全相同的段落。

有很多人似乎认为这是不可能的。我已经有一个工作应用程序创建极其准确的HTML-> PDF转换我们的文档 - 我只需要一个更好的添加BR的解决方案,因为我的解决方案有时会错过BR。顺便说一句,当它工作时,我的段落与HTML等价物的高度相同,这是我们追求的结果。

如果有人对我正在转换的doc类型感兴趣,那么你可以查看这个屏幕:

http://www.localsa.com.au/brochure/brochure.html

编辑:非常感谢Diodeus - 你的建议很明显。

解决方案: 对于我的情况,将单词换成空格而不是空格更有意义。

var text = paragraphElement.innerHTML.replace(/ / g,'< / span>< span>');

text =“< span>”+ text +“< / span>”; //包装第一个和最后一个单词。

这包含了一个范围内的每个单词。我现在可以查询文档以获取所有单词,迭代并比较y位置。当y pos更改时添加br。

这完美无缺,并且给了我需要的结果 - 谢谢!

5 个答案:

答案 0 :(得分:3)

我建议在span标记中包装所有空格并查找每个标记的坐标。当Y值发生变化时,您就在一条新线上。

答案 1 :(得分:3)

我认为这个问题不会有一个非常干净的解决方案,如果有的话。浏览器将流动一个段落以适应可用空间,在需要的地方划线。考虑一下,如果用户调整浏览器窗口的大小,所有段落都将被重新渲染,几乎肯定会改变他们的休息位置。如果用户更改页面上文本的大小,则会使用不同的换行符重新呈现段落。如果您(或页面上的某些脚本)更改了页面上另一个元素的大小,这将更改浮动段落的可用空间量 - 再次 - 不同的换行点。

此外,更改页面的实际标记以模仿浏览器为您执行的操作(并且做得非常好)对于您正在执行的操作而言似乎是错误的方法。你想在这里解决的实际问题是什么?可能有更好的方法来实现它。

修改:好的,因此您想要渲染为与“屏幕版本”相同的PDF。您是否有一个特定的确定屏幕版本 - 在浏览器窗口尺寸,用户样式表,字体首选项和调整后的字体大小方面? 关于HTML的关键是它故意不指定特定的布局。它简单地描述了页面上的内容,它们是什么以及它们彼此之间的关系。

我之前看到过几次被误导的尝试,它们会产生一些HTML,它会完全复制一个印刷的广告素材,设计类似于DTP应用程序,其中必须使用明确的绝对布局。由于HTML的本质,这些努力注定要失败,反之亦然(正如你所想的那样)甚至更糟,因为你甚至没有明确的起点从中工作。

假设这完全不在你的手中而且你必须无论如何,我的建议是放弃破坏HTML的想法。看看PDF转换软件 - 如果它有任何好处,它应该给你一些字体字距和类似设置的选项。在这里玩弄细节可以得到一些近似于浏览器中字体渲染的东西,从而在相同的位置打破线条。

如果做不到这一点,我所能建议的就是截取浏览器的屏幕截图并使用OCR解析它们以找出线路断裂的位置(它不应该需要非常准确的OCR,因为你知道原始文本是什么,它本质上是只需要数空间)。或者,如果文本搜索/选择不是什么大问题,或者只是将截图嵌入PDF中。

最后,手工完成这项工作可能是确保最直接可靠的唯一途径。

但实际上,这仍然只是错误,任何修改要求的尝试都会更好。继续向上迈进一步 - 为什么 PDF必须具有与任意浏览器渲染完全相同的粗糙边缘?你能用另一种(更好的)方式实现 目的吗?

答案 2 :(得分:0)

当您考虑用户设置的字体大小,MS Windows辅助功能模式以及数百种不同的移动设备时,这听起来不错。让浏览器做到这一点 - 试图对渲染进行精确控制只会让你感到沮丧。

答案 3 :(得分:0)

如果没有嵌入Gecko / WebKit / Trident或基本上重新创建它们,我认为你无法以任何精确度做到这一点。

答案 4 :(得分:0)

也许另类:自己做所有换行,而不是依赖浏览器。将所有文本放在预标签中,然后添加自己的换行符。现在至少你不必弄清楚浏览器的位置。