(self, filename, metadata=None)
| 425 | """PDF file object.""" |
| 426 | |
| 427 | def __init__(self, filename, metadata=None): |
| 428 | self.nextObject = 1 # next free object id |
| 429 | self.xrefTable = [[0, 65535, 'the zero object']] |
| 430 | self.passed_in_file_object = False |
| 431 | self.original_file_like = None |
| 432 | self.tell_base = 0 |
| 433 | fh, opened = cbook.to_filehandle(filename, "wb", return_opened=True) |
| 434 | if not opened: |
| 435 | try: |
| 436 | self.tell_base = filename.tell() |
| 437 | except IOError: |
| 438 | fh = BytesIO() |
| 439 | self.original_file_like = filename |
| 440 | else: |
| 441 | fh = filename |
| 442 | self.passed_in_file_object = True |
| 443 | |
| 444 | self._core14fontdir = os.path.join( |
| 445 | rcParams['datapath'], 'fonts', 'pdfcorefonts') |
| 446 | self.fh = fh |
| 447 | self.currentstream = None # stream object to write to, if any |
| 448 | fh.write(b"%PDF-1.4\n") # 1.4 is the first version to have alpha |
| 449 | # Output some eight-bit chars as a comment so various utilities |
| 450 | # recognize the file as binary by looking at the first few |
| 451 | # lines (see note in section 3.4.1 of the PDF reference). |
| 452 | fh.write(b"%\254\334 \253\272\n") |
| 453 | |
| 454 | self.rootObject = self.reserveObject('root') |
| 455 | self.pagesObject = self.reserveObject('pages') |
| 456 | self.pageList = [] |
| 457 | self.fontObject = self.reserveObject('fonts') |
| 458 | self.alphaStateObject = self.reserveObject('extended graphics states') |
| 459 | self.hatchObject = self.reserveObject('tiling patterns') |
| 460 | self.gouraudObject = self.reserveObject('Gouraud triangles') |
| 461 | self.XObjectObject = self.reserveObject('external objects') |
| 462 | self.resourceObject = self.reserveObject('resources') |
| 463 | |
| 464 | root = {'Type': Name('Catalog'), |
| 465 | 'Pages': self.pagesObject} |
| 466 | self.writeObject(self.rootObject, root) |
| 467 | |
| 468 | # get source date from SOURCE_DATE_EPOCH, if set |
| 469 | # See https://reproducible-builds.org/specs/source-date-epoch/ |
| 470 | source_date_epoch = os.getenv("SOURCE_DATE_EPOCH") |
| 471 | if source_date_epoch: |
| 472 | source_date = datetime.utcfromtimestamp(int(source_date_epoch)) |
| 473 | source_date = source_date.replace(tzinfo=UTC) |
| 474 | else: |
| 475 | source_date = datetime.today() |
| 476 | |
| 477 | self.infoDict = { |
| 478 | 'Creator': 'matplotlib %s, http://matplotlib.org' % __version__, |
| 479 | 'Producer': 'matplotlib pdf backend %s' % __version__, |
| 480 | 'CreationDate': source_date |
| 481 | } |
| 482 | if metadata is not None: |
| 483 | self.infoDict.update(metadata) |
| 484 | self.infoDict = {k: v for (k, v) in self.infoDict.items() |
nothing calls this directly
no test coverage detected