请教一个关于"HTML 转 pdf"的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
allele
V2EX    程序员

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

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

    最近我们遇到一个项目是:用随机不同的样式去打印 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  
    PRO
       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     Solana     2941 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 13:11 PVG 21:11 LAX 05:11 JFK 08:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86