88from datetime import datetime
99from functools import total_ordering
1010from io import BytesIO
11+ import itertools
1112import logging
1213import math
1314import os
@@ -424,7 +425,7 @@ class PdfFile:
424425 """PDF file object."""
425426
426427 def __init__ (self , filename , metadata = None ):
427- self .nextObject = 1 # next free object id
428+ self .objectId = itertools . count ( 1 ) # consumed by reserveObject
428429 self .xrefTable = [[0 , 65535 , 'the zero object' ]]
429430 self .passed_in_file_object = False
430431 self .original_file_like = None
@@ -482,21 +483,21 @@ def __init__(self, filename, metadata=None):
482483 if v is not None }
483484
484485 self .fontNames = {} # maps filenames to internal font names
485- self .nextFont = 1 # next free internal font name
486+ self .internalFontName = ( Name ( f'F { i } ' ) for i in itertools . count ( 1 ))
486487 self .dviFontInfo = {} # maps dvi font names to embedding information
487488 # differently encoded Type-1 fonts may share the same descriptor
488489 self .type1Descriptors = {}
489490 self .used_characters = {}
490491
491492 self .alphaStates = {} # maps alpha values to graphics state objects
492- self .nextAlphaState = 1
493+ self .alphaStateName = ( Name ( f'A { i } ' ) for i in itertools . count ( 1 ))
493494 # reproducible writeHatches needs an ordered dict:
494495 self .hatchPatterns = collections .OrderedDict ()
495- self .nextHatch = 1
496+ self .hatchPatternName = ( Name ( f'H { i } ' ) for i in itertools . count ( 1 ))
496497 self .gouraudTriangles = []
497498
498499 self ._images = collections .OrderedDict () # reproducible writeImages
499- self .nextImage = 1
500+ self .imageName = ( Name ( f'I { i } ' ) for i in itertools . count ( 1 ))
500501
501502 self .markers = collections .OrderedDict () # reproducible writeMarkers
502503 self .multi_byte_charprocs = {}
@@ -643,9 +644,8 @@ def fontName(self, fontprop):
643644
644645 Fx = self .fontNames .get (filename )
645646 if Fx is None :
646- Fx = Name ( 'F%d' % self .nextFont )
647+ Fx = next ( self .internalFontName )
647648 self .fontNames [filename ] = Fx
648- self .nextFont += 1
649649 _log .debug ('Assigning font %s = %r' , Fx , filename )
650650
651651 return Fx
@@ -669,8 +669,7 @@ def dviFontName(self, dvifont):
669669 "the font may lack a Type-1 version"
670670 .format (psfont .psname , dvifont .texname ))
671671
672- pdfname = Name ('F%d' % self .nextFont )
673- self .nextFont += 1
672+ pdfname = next (self .internalFontName )
674673 _log .debug ('Assigning font %s = %s (dvi)' , pdfname , dvifont .texname )
675674 self .dviFontInfo [dvifont .texname ] = types .SimpleNamespace (
676675 dvifont = dvifont ,
@@ -1186,8 +1185,7 @@ def alphaState(self, alpha):
11861185 if state is not None :
11871186 return state [0 ]
11881187
1189- name = Name ('A%d' % self .nextAlphaState )
1190- self .nextAlphaState += 1
1188+ name = next (self .alphaStateName )
11911189 self .alphaStates [alpha ] = \
11921190 (name , {'Type' : Name ('ExtGState' ),
11931191 'CA' : alpha [0 ], 'ca' : alpha [1 ]})
@@ -1207,8 +1205,7 @@ def hatchPattern(self, hatch_style):
12071205 if pattern is not None :
12081206 return pattern
12091207
1210- name = Name ('H%d' % self .nextHatch )
1211- self .nextHatch += 1
1208+ name = next (self .hatchPatternName )
12121209 self .hatchPatterns [hatch_style ] = name
12131210 return name
12141211
@@ -1300,9 +1297,8 @@ def imageObject(self, image):
13001297 if entry is not None :
13011298 return entry [1 ]
13021299
1303- name = Name ('I%d' % self .nextImage )
1304- ob = self .reserveObject ('image %d' % self .nextImage )
1305- self .nextImage += 1
1300+ name = next (self .imageName )
1301+ ob = self .reserveObject (f'image { name } ' )
13061302 self ._images [id (image )] = (image , name , ob )
13071303 return name
13081304
@@ -1495,8 +1491,7 @@ def reserveObject(self, name=''):
14951491 the object with writeObject.
14961492 """
14971493
1498- id = self .nextObject
1499- self .nextObject += 1
1494+ id = next (self .objectId )
15001495 self .xrefTable .append ([None , 0 , name ])
15011496 return Reference (id )
15021497
@@ -1510,7 +1505,7 @@ def writeObject(self, object, contents):
15101505 def writeXref (self ):
15111506 """Write out the xref table."""
15121507 self .startxref = self .fh .tell () - self .tell_base
1513- self .write (b"xref\n 0 %d\n " % self .nextObject )
1508+ self .write (b"xref\n 0 %d\n " % len ( self .xrefTable ) )
15141509 for i , (offset , generation , name ) in enumerate (self .xrefTable ):
15151510 if offset is None :
15161511 raise AssertionError (
@@ -1557,7 +1552,7 @@ def writeTrailer(self):
15571552
15581553 self .write (b"trailer\n " )
15591554 self .write (pdfRepr (
1560- {'Size' : self .nextObject ,
1555+ {'Size' : len ( self .xrefTable ) ,
15611556 'Root' : self .rootObject ,
15621557 'Info' : self .infoObject }))
15631558 # Could add 'ID'
0 commit comments