专栏首页JackeyGao的博客如何做一个实体日历技术方面印刷方面

如何做一个实体日历技术方面印刷方面

如何做一个实体日历

Posted December 24, 2018

#2019

诗词周历实体版大部分已经送出, 剩余部分也会酌情送出。

本篇唠下做一本实体日历用到了哪些东西, 虽然工作量大部分是技术编码方面, 但剩余联系打印社及了解打印纸张和打印的质量等东西对我来说比编码难多了。 甚至和打印店讨价还价也让我心力憔悴, 甚至失眠了几天. 但整个过程还是比较快乐的.

技术方面

诗词周历目前仅提供 Web ,以下技术栈用到的是最多的, 占代码工作量的70%.

  • HTML5
  • JavaScript
  • CSS3

诗词和配图作为主要内容, 整理这些也花费了很多时间. 这些会有一些简单的文本处理和配图爬虫的爬取. 因为时间的缘故配图和诗词都比较草率, 而且诗词和配图选取比较有个人倾向.

  • chinese-poetry
  • 泼辣有图

以上技术可以做一个 web 版本, 但做实体版为了印刷的方便, 还需要生成 PDF 或者其他格式的电子版. 这里主要是通过PyQt5生成55个PDF单页面, 然后 merge 成一个 PDF.

  • PyQt5
  • PyPDF2

印刷方面

一开始我对质量要求挺严格的, 后面我觉得能看就行. 纸张的规格第一版为 B5, 而且是铁圈装订, 拿到手后太像一本书了。 完全没有日历的样子. 后来改为 A5, 并且调整为竖版. 装订方式为书圈装订看起来更加简约, 可以挂着也可以配合支架摆放.

关于打印质量, 最后的版本是157g的铜版纸, 而且成品出来的厚度适中, 用最小的书圈翻页也比较灵活. 但这个纸折叠会掉颜料, 翻着翻着就会产生纸屑.

我一点都不会谈价钱, 这个还是别提了.

  • 纸张规格
  • 打印质量
  • 谈价钱

生成PDF脚本介绍

脚本通过 PyQt5 的 webView 引擎, 它是一个 Chrome 内核的浏览器, 我们用到pyQt 的打印功能, 生成每个页面(一周一个页面)的 PDF. 然后通过 PyPDF2 的 Merger 合并50+单页面 PDF.

python

import sys, os
from datetime import date, timedelta
from PyQt5.QtWidgets import QApplication
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
from PyQt5.QtCore import QMarginsF
from PyQt5.QtPrintSupport import QPrinter
from PyQt5.QtGui import QPageLayout, QPageSize
from PyPDF2 import PdfFileMerger


root = "https://shici.store/poetry-calendar"

def log(msg):
    print("+ " + msg);


def printPDF(url, margins):
    app = QtWidgets.QApplication(sys.argv)
    loader = QtWebEngineWidgets.QWebEngineView()
    loader.setZoomFactor(1)
    loader.load(QtCore.QUrl(url))
    
    layout = QPageLayout(
        QPageSize(QPageSize.A4),
        QPageLayout.Portrait, QMarginsF(margins[0], margins[1], margins[2], margins[3])
    )
    
    def printFinished():
        page = loader.page()
        page.profile().clearHttpCache()
        log("%s Printing Finished!" % page.title())
        app.exit()
    
    def printToPDF(finished):
        loader.show()
        page = loader.page()
        page.printToPdf("./pdfs/%s.pdf" % page.title(), layout)
    
    
    loader.page().pdfPrintingFinished.connect(printFinished)
    loader.loadFinished.connect(printToPDF)

    app.exec_()


if __name__ == '__main__':
    year = 2019

    d = date(year, 01, 01)

    if not os.path.exists('./pdfs'):
        os.makedirs('./pdfs')
        log("+ Created directory './pdfs';")


    # cover page and end page.
    margins = [0, 0, 0, 0]
    printPDF(root + '/first.html', margins)
    printPDF(root + '/end.html', margins)

    margins = [16, 32, 16, 32]
    while True:
        if d.year > year:
            break    

        url = root + '/?d=' + str(d)
        printPDF(url, margins)
        
        d = d + timedelta(days=7)



    log("+ Merging PDF files;")

    pdfs = [ os.path.join('./pdfs', x) for x in os.listdir('./pdfs') if x.endswith(".pdf") ]

    merger = PdfFileMerger()

    for pdf in pdfs:
        print pdf
        merger.append(open(pdf, 'rb'))

    with open("%s.pdf" % year, "wb") as fout:
        merger.write(fout)

    log("+ Merged! Save as '%s.pdf'" % year)

PDF 直接下载

链接: https://pan.baidu.com/s/1aoL6VflUsFTeD0Vzbo3LSg 提取码: tni4

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用PyQt5把网页打印成PDF

    最近制作诗词日历的 PDF 版本, 准备打印一下做成实体日历。之前我写过一篇优化 print 样式的文章,在 Google 上搜索page to pdf, 大多...

    用户1416054
  • Django Admin输出JSON

    Django 自带Admin后台这是Django的优势所在, 这样的话我们可以开箱即用后台功能。 有人说Django重, 可能设计就是这样, 过度的封装就是让开...

    用户1416054
  • Django小技巧01: redirect

    redirect函数会返回一个HttpResponseRedirect类,比起HttpResponseRedirect类我更喜欢使用更简洁的redirect. ...

    用户1416054
  • 微信小程序调用接口获取登录获取用户信息

    沈唁
  • Jmeter接口测试实战-数据传递

    接口与接口之间没有关联的测试是缺乏意义和没有灵魂的,只有数据在不同接口之间传递才能勾画出业务场景重要的链路. 我们用较为通用的http/https协议,接口普遍...

    louiezhou001
  • webgestalt:基因富集分析的在线工具

    在组学数据分析中,基因富集分析是最常用的方法之一,所有的基因数据分析最终都要落实到功能上去,富集分析作为一种最基础的功能研究方法,通过go, kegg path...

    生信修炼手册
  • Keras作者François Chollet:一位“网红”科学家的自我修养

    大数据文摘
  • 2018年为什么要学习Linux?Linux运维的前景还好吗?

    Linux一直是很多人入行IT的首选,无论是从入行难度还是职业寿命来说,Linux运维都比开发有着更大的优势。为了得到高薪工作,很多人在Linux学习过程中付出...

    马哥教育
  • Python 代码精简和优化

    Python很简单,容易使用,开发效率很高,移植性很好,代码资源也很丰富,被广泛使用。但是Python代码编出来的动态库比较大,python库很全,缺点就是库比...

    py3study
  • sqlite - java 初学

    进来准备使用一种embedded database,即嵌入式数据库,方便随项目本地存储。目前学习打算是sqlite和H2。 document:http://ww...

    Ryan-Miao

扫码关注云+社区

领取腾讯云代金券