【发布时间】:2020-05-24 03:39:15
【问题描述】:
我想在 iOS 中为 libHaru PDF 添加自动分页符。
我在应用程序中有几个包含用户填写数据的文本字段。当我生成 pdf 时,我首先测量要创建的文本矩形的预期大小。如果超出剩余空间,我会触发 hpdf_new_page 事件并将文本放在新页面上。我想部分自动地拥有它。因此,如果文本超出当前页面上的空间,它应该拆分并在新页面上继续,而无需我检查或执行任何操作。 不幸的是,我在文档中找不到类似的内容。
【问题讨论】:
我想在 iOS 中为 libHaru PDF 添加自动分页符。
我在应用程序中有几个包含用户填写数据的文本字段。当我生成 pdf 时,我首先测量要创建的文本矩形的预期大小。如果超出剩余空间,我会触发 hpdf_new_page 事件并将文本放在新页面上。我想部分自动地拥有它。因此,如果文本超出当前页面上的空间,它应该拆分并在新页面上继续,而无需我检查或执行任何操作。 不幸的是,我在文档中找不到类似的内容。
【问题讨论】:
使用 fgets() 进行行数可能会有所帮助。当您的打印程序打开要打印的文件时,可以将每一行复制到 pdf 文件并检查换页符
或
如果行数已达到限制。
另一种可能的解决方案是在“while(getc(file) != EOF)”中使用字符数限制。
此链接使用 libharu 打印带有 PCL 命令以更改字体的基本文本文件。 https://github.com/DaDaDadeo/GetCycle/blob/master/pcl_to_pdf.c
换页符 '\f' (ascii 12) 和 61 行将触发一个新页面。程序中还有其他条件来限制新页面,但说明了总体思路。
结果与使用 telnet raw 9100 协议的打印机相同。 pcl 命令仅限于几个字体更改,所以它不是太复杂。
【讨论】:
Libharu 是相当低级的库,由于多种原因,我什至无法期望在新版本中出现这种自动分页。下面我说两个:
为什么?
请考虑您的字体非常大,并且只有 一个字母(例如,宽一个为“W”)不适合页面。我们应该把它放在哪里?在下一页?好的,我们添加新页面...哎呀,它也不适合这个页面 - 只要我们所有的页面都具有相同的大小。没有任何好的、直接的出路的死胡同。 换句话说,应该有针对这些情况的用户定义策略。 Almosy 每个幼稚的实现都会有这样的极端情况。
libharu 不知道它应该在 哪里 自动拆分您的文本。它不知道你的语言的断字规则,它不知道它是否应该尊重空格(是否只换行)等等。由您来指定这些规则。
因此,您应该为文本字符串的某些部分调用 HPDF_Font_MeasureText,确定它是否适合您的页面(不包括边距、页脚 - 这也是 libharu 的内部知识)并呈现它。请注意,文本大小没有简单的公式取决于其长度。字符串 "ww" 比 "iiii" 宽两倍多,当然如果你的字体不是等距的。
【讨论】: