go 语言学习练手项目(一):html转pdf并添加属于自己的水印

缘由

同事找了个腾讯微服务开发文档,由于工作原因不方便一直用外网,所以希望我能帮忙把这个文件爬取下来并生成pdf格式,一开始想的很简单,不就是爬取gitbook吗,网上现成工具一大堆

soeasy.jpg

不简单的链接: https://tsf-gitbook-1257356411.cos.ap-chengdu.myqcloud.com/1.12.4/usage/%E4%BA%A7%E5%93%81%E7%AE%80%E4%BB%8B/%E4%BA%A7%E5%93%81%E6%A6%82%E8%BF%B0.html

链接不简单的地方

  1. 根链接(https://tsf-gitbook-1257356411.cos.ap-chengdu.myqcloud.com/1.12.4/usage/)无法访问
  2. 很多链接混乱,点第一个章节和第二个章节看到的html源码中链接数量和内容不同
  3. 部分链接无法点击,可能文章未写完
  4. 由于根链接无法访问,只能使用中文路径去转换,导致很多现成工具无法使用
    (https://github.com/TruthHun/converter)

++这种不规范gitbook只能自己编码来实现爬取++

思路

  1. 找一个可以将html转为pdf工具
  2. 获取所有html并打包成一个zip文件,使用工具直接转为pdf

使用现成工具

下载工具

Calibre(html转pdf)

  • 安装calibre
  • 下载地址:https://calibre-ebook.com/download
  • 根据自己的系统安装对应的calibre(需要注意的是,calibre要安装3.x版本的,2.x版本的功能不是很强大。反正安装最新的就好。) 安装完calibre之后,将calibre加入到系统环境变量中,执行下面的命令之后显示3.x的版本即表示安装成功。
    ebook-convert --version

google 浏览器(保存当前html)

使用方式:
image.png

目前我还没有找到那种可以一键保留当前所有页面html工具,如果你有,请告诉我,不免费要,给你钱

使用方式

  1. 生成.epub格式文件,在此不详述,可参考下方代码实现方式了解细节(了解实现细节)
  2. 使用命令ebook-convert demo.epub demo.pdf

编码方式

此方式由使用工具方式演变而来,具体思路是一致的

  1. 获取所有内容,并保存为html
1. 根据配置文件中配置爬取url获取当前页面所有要爬取的页面
2. 获取完毕发现爬取html中都存在类似左边目录的链接,这种html对pdf目录很不友好
3. 这里我们只获取gitbook中bookbody中内容,自己通过合成html方式生成html
body := htmlquery.Find(doc, "//div[@class='page-inner']")
        if len(body) != 0 {
            pdfBody := body[0]
            htmlBody := htmlquery.OutputHTML(pdfBody, true)
            htmlTempleta := `<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <title>%v</title>
    <link href="gitbook.css" rel="stylesheet">
</head>
<body>%v
</body>
</html>`
htmlTempleta = fmt.Sprintf(htmlTempleta, book.Title, htmlBody)
  1. 生成目录html
htmlTempleta := `<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <title>%v</title>
    <link href="gitbook.css" rel="stylesheet">
</head>
<body>%v
</body>
</html>`
    htmlTempleta = fmt.Sprintf(htmlTempleta, value, value)
  1. <span id="epub">组装epub文件(参考链接)

    1. 生成mimetype
    2. 生成container.xml文件
    3. 生成目录文件
    4. 生成首页log
    5. 生成content.opf文件
    6. 将上述生成文件打包并组装为zip文件,然后修改后缀为epub即可
      </span>
  2. 使用calibre命令转换html为pdf(pdf可选选项)

args := []string{
        this.BasePath+"/content.epub",
        this.BasePath + "/" + output + "/book.pdf",
    }
    //页面大小
    if len(this.Config.PaperSize) > 0 {
        args = append(args, "--paper-size", this.Config.PaperSize)
    }
    //文字大小
    if len(this.Config.FontSize) > 0 {
        args = append(args, "--pdf-default-font-size", this.Config.FontSize)
    }

    //header template
    if len(this.Config.Header) > 0 {
        args = append(args, "--pdf-header-template", this.Config.Header)
    }

    //footer template
    if len(this.Config.Footer) > 0 {
        args = append(args, "--pdf-footer-template", this.Config.Footer)
    }

    if len(this.Config.MarginLeft) > 0 {
        args = append(args, "--pdf-page-margin-left", this.Config.MarginLeft)
    }
    if len(this.Config.MarginTop) > 0 {
        args = append(args, "--pdf-page-margin-top", this.Config.MarginTop)
    }
    if len(this.Config.MarginRight) > 0 {
        args = append(args, "--pdf-page-margin-right", this.Config.MarginRight)
    }
    if len(this.Config.MarginBottom) > 0 {
        args = append(args, "--pdf-page-margin-bottom", this.Config.MarginBottom)
    }

    //更多选项
    if len(this.Config.More) > 0 {
        args = append(args, this.Config.More...)
    }
    fmt.Println(args)
    cmd := exec.Command(ebookConvert, args...)
    return cmd.Run()

注意事项

  1. 这种方式对通用的gitbook不实用,如果想要生效,需要修改爬取逻辑,具体代码在crawl/htmlspider中,修改其中需要抓取的具体逻辑
  2. 自动生成的json文件因为存在部分链接无法跳转的情况,需要修改自动生成json文件,详情参考github代码文档
  3. 上才艺
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352