8
8
from datetime import datetime
9
9
from functools import total_ordering
10
10
from io import BytesIO
11
+ import itertools
11
12
import logging
12
13
import math
13
14
import os
@@ -424,7 +425,7 @@ class PdfFile:
424
425
"""PDF file object."""
425
426
426
427
def __init__ (self , filename , metadata = None ):
427
- self .nextObject = 1 # next free object id
428
+ self .objectId = itertools . count ( 1 ) # consumed by reserveObject
428
429
self .xrefTable = [[0 , 65535 , 'the zero object' ]]
429
430
self .passed_in_file_object = False
430
431
self .original_file_like = None
@@ -482,21 +483,21 @@ def __init__(self, filename, metadata=None):
482
483
if v is not None }
483
484
484
485
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 ))
486
487
self .dviFontInfo = {} # maps dvi font names to embedding information
487
488
# differently encoded Type-1 fonts may share the same descriptor
488
489
self .type1Descriptors = {}
489
490
self .used_characters = {}
490
491
491
492
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 ))
493
494
# reproducible writeHatches needs an ordered dict:
494
495
self .hatchPatterns = collections .OrderedDict ()
495
- self .nextHatch = 1
496
+ self .hatchPatternName = ( Name ( f'H { i } ' ) for i in itertools . count ( 1 ))
496
497
self .gouraudTriangles = []
497
498
498
499
self ._images = collections .OrderedDict () # reproducible writeImages
499
- self .nextImage = 1
500
+ self .imageName = ( Name ( f'I { i } ' ) for i in itertools . count ( 1 ))
500
501
501
502
self .markers = collections .OrderedDict () # reproducible writeMarkers
502
503
self .multi_byte_charprocs = {}
@@ -643,9 +644,8 @@ def fontName(self, fontprop):
643
644
644
645
Fx = self .fontNames .get (filename )
645
646
if Fx is None :
646
- Fx = Name ( 'F%d' % self .nextFont )
647
+ Fx = next ( self .internalFontName )
647
648
self .fontNames [filename ] = Fx
648
- self .nextFont += 1
649
649
_log .debug ('Assigning font %s = %r' , Fx , filename )
650
650
651
651
return Fx
@@ -669,8 +669,7 @@ def dviFontName(self, dvifont):
669
669
"the font may lack a Type-1 version"
670
670
.format (psfont .psname , dvifont .texname ))
671
671
672
- pdfname = Name ('F%d' % self .nextFont )
673
- self .nextFont += 1
672
+ pdfname = next (self .internalFontName )
674
673
_log .debug ('Assigning font %s = %s (dvi)' , pdfname , dvifont .texname )
675
674
self .dviFontInfo [dvifont .texname ] = types .SimpleNamespace (
676
675
dvifont = dvifont ,
@@ -1186,8 +1185,7 @@ def alphaState(self, alpha):
1186
1185
if state is not None :
1187
1186
return state [0 ]
1188
1187
1189
- name = Name ('A%d' % self .nextAlphaState )
1190
- self .nextAlphaState += 1
1188
+ name = next (self .alphaStateName )
1191
1189
self .alphaStates [alpha ] = \
1192
1190
(name , {'Type' : Name ('ExtGState' ),
1193
1191
'CA' : alpha [0 ], 'ca' : alpha [1 ]})
@@ -1207,8 +1205,7 @@ def hatchPattern(self, hatch_style):
1207
1205
if pattern is not None :
1208
1206
return pattern
1209
1207
1210
- name = Name ('H%d' % self .nextHatch )
1211
- self .nextHatch += 1
1208
+ name = next (self .hatchPatternName )
1212
1209
self .hatchPatterns [hatch_style ] = name
1213
1210
return name
1214
1211
@@ -1300,9 +1297,8 @@ def imageObject(self, image):
1300
1297
if entry is not None :
1301
1298
return entry [1 ]
1302
1299
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 } ' )
1306
1302
self ._images [id (image )] = (image , name , ob )
1307
1303
return name
1308
1304
@@ -1495,8 +1491,7 @@ def reserveObject(self, name=''):
1495
1491
the object with writeObject.
1496
1492
"""
1497
1493
1498
- id = self .nextObject
1499
- self .nextObject += 1
1494
+ id = next (self .objectId )
1500
1495
self .xrefTable .append ([None , 0 , name ])
1501
1496
return Reference (id )
1502
1497
@@ -1510,7 +1505,7 @@ def writeObject(self, object, contents):
1510
1505
def writeXref (self ):
1511
1506
"""Write out the xref table."""
1512
1507
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 ) )
1514
1509
for i , (offset , generation , name ) in enumerate (self .xrefTable ):
1515
1510
if offset is None :
1516
1511
raise AssertionError (
@@ -1557,7 +1552,7 @@ def writeTrailer(self):
1557
1552
1558
1553
self .write (b"trailer\n " )
1559
1554
self .write (pdfRepr (
1560
- {'Size' : self .nextObject ,
1555
+ {'Size' : len ( self .xrefTable ) ,
1561
1556
'Root' : self .rootObject ,
1562
1557
'Info' : self .infoObject }))
1563
1558
# Could add 'ID'
0 commit comments