如何让生成的PDF具备更友好的文本复制粘贴体验?
我太懂你这种挫败感了!之前手动写PDF操作符生成文档时,也被Acrobat这“自作主张”的文本复制逻辑坑过——明明是完全分开的两行文本,复制出来就硬给加个换行符,把本来独立的内容粘成一串。
先给你拆解下问题根源:Acrobat在解析可复制文本时,会默认根据文本的垂直间距、排版位置来推断“行”和“段落”的关系。哪怕你用Tm手动重置文本矩阵,只要两行的间距看起来像常规行高,它就会把它们判定为同一段的不同行,复制时自动插入换行。
接下来给你几个实用的解决办法,不用搞复杂的完整Tagged PDF也能搞定:
1. 用段落级标记内容分隔文本块
你之前试的/Span是行内标记,Acrobat还是会把它当成同一段的内容。换成段落级的/P标记,把每个独立的文本块用BDC/EMC包裹起来,就能明确告诉Acrobat“这是两个独立的段落”:
% 第一个独立文本块(段落) /P <</MCID 1>> BDC BT /F0 24 Tf 1 0 0 1 200 500 Tm (Hello world) Tj ET EMC % 第二个独立文本块(段落) /P <</MCID 2>> BDC BT 1 0 0 1 200 300 Tm (Testing) Tj ET EMC
这样处理后,Acrobat就会正确识别两个独立的段落,复制时不会自动添加换行符,而是保留它们的独立状态。
2. 拉大垂直间距(治标不治本但应急可用)
如果暂时不想碰标记内容,可以把两个文本块的垂直间距拉得足够大——超过Acrobat默认的“行间距阈值”(比如24号字体的话,间距拉到35以上)。不过这个方法会影响排版美观,只能作为临时应急方案。
3. 用空白文本块做“分隔符”(hack技巧)
在两个文本块之间插入一个不可见的空白文本(比如用0字号或者把文本放在可视区域外),相当于给Acrobat一个“这里是段落分隔”的信号。不过这个方法比较hack,不如标记内容靠谱,不推荐长期用。
总的来说,段落级标记内容是最稳妥的方案,不用做完整的Tagged PDF,只要给每个独立文本块加上/P标记的包裹,就能让Acrobat的文本复制逻辑乖乖听话,不再乱加换行啦。
备注:内容来源于stack exchange,提问作者Gebodal

