V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
allele
V2EX  ›  程序员

请教一个关于"HTML 转 pdf"的问题

  •  
  •   allele · 2020-05-16 19:22:13 +08:00 · 3054 次点击
    这是一个创建于 1650 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近我们遇到一个项目是:用随机不同的样式去打印 csv 里十几万条少数民族语。 我们的想法是:

    1. .csv中的每一条语句转成.html中的一个<p>
    2. 打印这个.html,得到一个.pdf

    现在遇到的问题是:我们需要得到.csv里的每一条item对应的.pdf页数。

    举个例子,.csv里的第 1000 条句子,最终打印出来在.pdf的第五十页,那么我们就需要得到一个(1000,50)

    现在的困惑是:.html打印成.pdf的过程似乎是一个黑盒。没有办法深入到底层去得知某一个<p>最终会落在哪张页面上。

    希望有了解 HTML 打印的同学可以帮忙指个路。

    亦或者大家有什么更好的思路来实现这个需求。

    ————————————————————————————————————————

    之所以不去用 python 中的reportlab是因为reportlab对 RTL (从右到左排版)的支持并不好。

    16 条回复    2020-05-17 13:23:08 +08:00
    myd
        1
    myd  
       2020-05-16 19:28:17 +08:00 via Android
    手动控制分页
    exip
        2
    exip  
       2020-05-16 19:31:24 +08:00 via Android
    html 上在哪页 pdf 上不就是在哪页吗?
    allele
        3
    allele  
    OP
       2020-05-16 19:40:01 +08:00
    @myd 手动控制分页的问题在于”你不知道应该隔多少个<p>换一次页“。我们现在的想法就是每隔 20 行强制换页,同时保证字体不要太大。就是想知道有没有我们遗漏的更好的办法。
    allele
        4
    allele  
    OP
       2020-05-16 19:40:57 +08:00
    @exip html 页面是什么意思? html 不是一个很长很长的东西吗?
    TimePPT
        5
    TimePPT  
       2020-05-16 19:51:09 +08:00   ❤️ 1
    其实你的需求是纸质打印一本书,带目录索引?
    allele
        6
    allele  
    OP
       2020-05-16 19:54:14 +08:00
    @TimePPT 欸?这个思路很好欸?好像就是要把每一句话都收录到目录里。
    dallaslu
        7
    dallaslu  
       2020-05-16 19:54:21 +08:00
    做一堆撑满一页的高度的块元素,然后均匀地把内容放进去?
    redtea
        8
    redtea  
       2020-05-16 19:59:07 +08:00
    openhtmltopdf 可以实现,但是用的是 Java 。
    allele
        9
    allele  
    OP
       2020-05-16 20:04:02 +08:00
    @redtea 哇哦~我去看看
    967182
        10
    967182  
       2020-05-16 20:12:17 +08:00
    html 当然能控制让它分页啊
    <div style="page-break-before: always">
    <div id=page2 style='position:relative;width:760px;height:1070px;'>
    967182
        11
    967182  
       2020-05-16 20:17:13 +08:00
    html 转换可以试试 https://wkhtmltopdf.org/index.html 这个工具,效果还不错。
    allele
        12
    allele  
    OP
       2020-05-16 20:25:09 +08:00
    @967182 嗯嗯。能换页我知道,包括我们现在的做法就是每隔 28 个<p>插入一个换页。但是这样的做法终究不美观。
    967182
        13
    967182  
       2020-05-16 20:33:27 +08:00
    @allele 其实你要做的不就是 PDF 加载到程序中,然后一页一页的循环看有没有符合你条件的数据。
    ccraohng
        14
    ccraohng  
       2020-05-16 23:42:48 +08:00 via Android   ❤️ 1
    手动分页数据兼容性不好吧。我们用的是 wkhtml 。可以读取 pdf 内容,再匹配查找
    xiaoming1992
        15
    xiaoming1992  
       2020-05-17 00:36:00 +08:00 via Android
    canvas 有个方法叫 measureText,可以以此来精确地控制文字的换行,并算出 csv 每一项的高度,据此手动控制何时分页,效率可能会有些差,但才十几万条,应该不碍事。只是不知道对少数民族语的支持如何。
    no1xsyzy
        16
    no1xsyzy  
       2020-05-17 13:23:08 +08:00
    1. 考虑 xelatex
    2. 考虑生成后再重新去解析 PDF (脏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1093 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:57 · PVG 06:57 · LAX 14:57 · JFK 17:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.