Merge pull request #129 from clustree/xml-color

FEAT: Send color to XML conversion
pull/157/head
Tata Ganesh 2018-06-10 21:02:34 +05:30 committed by GitHub
commit 7084d81bd1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 40 additions and 30 deletions

View File

@ -112,7 +112,7 @@ class PDFLayoutAnalyzer(PDFTextDevice):
evenodd, gstate.scolor, gstate.ncolor))
return
def render_char(self, matrix, font, fontsize, scaling, rise, cid):
def render_char(self, matrix, font, fontsize, scaling, rise, cid, ncs, graphicstate):
try:
text = font.to_unichr(cid)
assert isinstance(text, six.text_type), str(type(text))
@ -120,7 +120,7 @@ class PDFLayoutAnalyzer(PDFTextDevice):
text = self.handle_undefined_char(font, cid)
textwidth = font.char_width(cid)
textdisp = font.char_disp(cid)
item = LTChar(matrix, font, fontsize, scaling, rise, text, textwidth, textdisp)
item = LTChar(matrix, font, fontsize, scaling, rise, text, textwidth, textdisp, ncs, graphicstate)
self.cur_item.add(item)
return item.adv
@ -520,8 +520,9 @@ class XMLConverter(PDFConverter):
render(child)
self.write('</textbox>\n')
elif isinstance(item, LTChar):
self.write('<text font="%s" bbox="%s" size="%.3f">' %
(enc(item.fontname, None), bbox2str(item.bbox), item.size))
self.write('<text font="%s" bbox="%s" colourspace="%s" ncolour="%s" size="%.3f">' %
(enc(item.fontname, None), bbox2str(item.bbox),
item.ncs.name, item.graphicstate.ncolor, item.size))
self.write_text(item.get_text())
self.write('</text>\n')
elif isinstance(item, LTText):

View File

@ -228,11 +228,13 @@ class LTAnno(LTItem, LTText):
class LTChar(LTComponent, LTText):
def __init__(self, matrix, font, fontsize, scaling, rise,
text, textwidth, textdisp):
text, textwidth, textdisp, ncs, graphicstate):
LTText.__init__(self)
self._text = text
self.matrix = matrix
self.fontname = font.fontname
self.ncs = ncs
self.graphicstate = graphicstate
self.adv = textwidth * fontsize * scaling
# compute the boundary rectangle.
if font.is_vertical():

View File

@ -1,4 +1,4 @@
import collections
from .psparser import LIT
import six #Python 2+3 compatibility
@ -21,17 +21,20 @@ class PDFColorSpace(object):
return '<PDFColorSpace: %s, ncomponents=%d>' % (self.name, self.ncomponents)
PREDEFINED_COLORSPACE = {}
for (name, n) in six.iteritems({
'CalRGB': 3,
'CalGray': 1,
'Lab': 3,
'DeviceRGB': 3,
'DeviceCMYK': 4,
'DeviceGray': 1,
'Separation': 1,
'Indexed': 1,
'Pattern': 1,
}) :
PREDEFINED_COLORSPACE[name]=PDFColorSpace(name, n)
if six.PY2:
PREDEFINED_COLORSPACE = {}
else:
PREDEFINED_COLORSPACE = collections.OrderedDict()
for (name, n) in [
('DeviceGray', 1), # default value first
('CalRGB', 3),
('CalGray', 1),
('Lab', 3),
('DeviceRGB', 3),
('DeviceCMYK', 4),
('Separation', 1),
('Indexed', 1),
('Pattern', 1),
]:
PREDEFINED_COLORSPACE[name]=PDFColorSpace(name, n)

View File

@ -66,7 +66,7 @@ class PDFDevice(object):
##
class PDFTextDevice(PDFDevice):
def render_string(self, textstate, seq):
def render_string(self, textstate, seq, ncs, graphicstate):
matrix = utils.mult_matrix(textstate.matrix, self.ctm)
font = textstate.font
fontsize = textstate.fontsize
@ -80,15 +80,16 @@ class PDFTextDevice(PDFDevice):
if font.is_vertical():
textstate.linematrix = self.render_string_vertical(
seq, matrix, textstate.linematrix, font, fontsize,
scaling, charspace, wordspace, rise, dxscale)
scaling, charspace, wordspace, rise, dxscale, ncs, graphicstate)
else:
textstate.linematrix = self.render_string_horizontal(
seq, matrix, textstate.linematrix, font, fontsize,
scaling, charspace, wordspace, rise, dxscale)
scaling, charspace, wordspace, rise, dxscale, ncs, graphicstate)
return
def render_string_horizontal(self, seq, matrix, pos,
font, fontsize, scaling, charspace, wordspace, rise, dxscale):
font, fontsize, scaling, charspace, wordspace,
rise, dxscale, ncs, graphicstate):
(x, y) = pos
needcharspace = False
for obj in seq:
@ -100,14 +101,16 @@ class PDFTextDevice(PDFDevice):
if needcharspace:
x += charspace
x += self.render_char(utils.translate_matrix(matrix, (x, y)),
font, fontsize, scaling, rise, cid)
font, fontsize, scaling, rise, cid,
ncs, graphicstate)
if cid == 32 and wordspace:
x += wordspace
needcharspace = True
return (x, y)
def render_string_vertical(self, seq, matrix, pos,
font, fontsize, scaling, charspace, wordspace, rise, dxscale):
font, fontsize, scaling, charspace, wordspace,
rise, dxscale, ncs, graphicstate):
(x, y) = pos
needcharspace = False
for obj in seq:
@ -119,13 +122,14 @@ class PDFTextDevice(PDFDevice):
if needcharspace:
y += charspace
y += self.render_char(utils.translate_matrix(matrix, (x, y)),
font, fontsize, scaling, rise, cid)
font, fontsize, scaling, rise, cid,
ncs, graphicstate)
if cid == 32 and wordspace:
y += wordspace
needcharspace = True
return (x, y)
def render_char(self, matrix, font, fontsize, scaling, rise, cid):
def render_char(self, matrix, font, fontsize, scaling, rise, cid, ncs, graphicstate):
return 0

View File

@ -586,13 +586,13 @@ class PDFPageInterpreter(object):
# setgray-stroking
def do_G(self, gray):
self.graphicstate.color = gray
self.graphicstate.scolor = gray
#self.do_CS(LITERAL_DEVICE_GRAY)
return
# setgray-non-stroking
def do_g(self, gray):
self.graphicstate.color = gray
self.graphicstate.ncolor = gray
#self.do_cs(LITERAL_DEVICE_GRAY)
return
@ -769,7 +769,7 @@ class PDFPageInterpreter(object):
if settings.STRICT:
raise PDFInterpreterError('No font specified!')
return
self.device.render_string(self.textstate, seq)
self.device.render_string(self.textstate, seq, self.ncs, self.graphicstate.copy())
return
# show