使用Reportlab创建pdf时,如何更改元数据字段CreationDate和ModificationDate?
答案 0 :(得分:1)
Take a look,其中设置了修改和创建日期:
D['ModDate'] = D["CreationDate"] = \
Date(ts=document._timeStamp,dateFormatter=self._dateFormatter)
# ...
return PDFDictionary(D).format(document)
基本上,元数据是保存在二进制字符串末尾的字典,字符串的开头是文件内容(document
)。
在Reportlab内部,您要求的工作流程可以是:
document
PDFDictionary
并创建日期PDFDictionary
答案 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)