ReportLab-元数据,CreationDate和ModificationDate

时间:2018-09-16 22:18:04

标签: python-3.x reportlab

使用Reportlab创建pdf时,如何更改元数据字段CreationDate和ModificationDate?

2 个答案:

答案 0 :(得分:1)

Take a look,其中设置了修改和创建日期:

D['ModDate'] = D["CreationDate"] = \
             Date(ts=document._timeStamp,dateFormatter=self._dateFormatter)
# ...
return PDFDictionary(D).format(document)

基本上,元数据是保存在二进制字符串末尾的字典,字符串的开头是文件内容(document)。

在Reportlab内部,您要求的工作流程可以是:

  • 创建画布
  • 在上面画些东西
  • 从画布上获取document
  • 使用人工mod创建PDFDictionary并创建日期
  • 使用PDFDictionary
  • 格式化文档
  • 保存到文件

Change metadata of pdf file with pypdf也尝试类似的目标。

答案 1 :(得分:0)

ReportLab(当前为3.5)Canvas提供了Canvas.setAuthor()之类的公共方法来设置/Author/Title和其他元数据字段(称为“内部文件注释” docs,第4.5节)。

但是,没有方法可以覆盖/CreationDate/ModDate

如果只需要更改日期的格式,则只需使用Canvas.setDateFormatter()方法。

上述方法修改了PDFInfo对象,如source所示,但这是 private PDFDocument的一部分(如Canvas._doc.info

如果确实需要覆盖日期,则可以入侵画布的私有部分,或者仅在生成的文件对象的内容中搜索/CreationDate (...)/ModDate (...),然后替换括号之间的值。

这是一个简单的例子,它就是这样做的:

import io
import re
from reportlab.pdfgen import canvas

# write a pdf in a file-like object
file_like_obj = io.BytesIO()
p = canvas.Canvas(file_like_obj)
# set some metadata
p.setAuthor('djvg')
# ... add some content here ...
p.save()

# replace the /CreationDate (similar for /ModDate )
pdf_bytes = file_like_obj.getvalue()
pdf_bytes = re.sub(b'/CreationDate (\w*)', b'/CreationDate (D:19700101010203+01)', pdf_bytes)

# write to actual file
with open('test.pdf', 'wb') as pdf:
    pdf.write(pdf_bytes)

以上示例仅说明了原理。显然,人们可以将花式正则表达式与环视等配合使用。

摘自pdf spec

PDF中使用的日期值应符合标准日期格式,该格式应严格遵循ISO / IEC 8824中定义的国际标准ASN.1(抽象语法符号1)的格式。日期应为以下格式的文本字符串:表格

(D:YYYYMMDDHHmmSSOHH'mm)