text rotation handling fixed.

git-svn-id: https://pdfminerr.googlecode.com/svn/trunk/pdfminer@137 1aa58f4a-7d42-0410-adbc-911cccaed67c
pull/1/head
yusuke.shinyama.dummy 2009-10-03 04:36:54 +00:00
parent 6a2cb8148d
commit 2ed6b90551
4 changed files with 16 additions and 14 deletions

View File

@ -266,29 +266,28 @@ class LTTextItem(LayoutItem, LTText):
assert chars assert chars
self.matrix = matrix self.matrix = matrix
self.font = font self.font = font
(_,_,_,_,tx,ty) = self.matrix self.vertical = font.is_vertical()
self.vertical = self.font.is_vertical()
self.text = ''.join( char for (char,_) in chars ) self.text = ''.join( char for (char,_) in chars )
adv = sum( font.char_width(cid) for (_,cid) in chars ) adv = sum( font.char_width(cid) for (_,cid) in chars )
adv = (adv * fontsize + len(chars)*charspace) * scaling adv = (adv * fontsize + len(chars)*charspace) * scaling
#size = (font.get_ascent() - font.get_descent()) * fontsize #size = (font.get_ascent() - font.get_descent()) * fontsize
size = font.get_size() * fontsize size = font.get_size() * fontsize
(_,_,_,_,tx,ty) = self.matrix
if not self.vertical: if not self.vertical:
# horizontal text # horizontal text
self.vertical = False self.adv = (adv, 0)
(dx,dy) = apply_matrix_norm(self.matrix, (adv,size)) (dx,dy) = apply_matrix_norm(self.matrix, (adv,size))
(_,descent) = apply_matrix_norm(self.matrix, (0,font.get_descent() * fontsize)) (_,descent) = apply_matrix_norm(self.matrix, (0,font.get_descent() * fontsize))
ty += descent ty += descent
self.adv = (dx, 0)
bbox = (tx, ty, tx+dx, ty+dy) bbox = (tx, ty, tx+dx, ty+dy)
else: else:
# vertical text # vertical text
self.adv = (0, adv)
(_,cid) = chars[0] (_,cid) = chars[0]
(_,disp) = apply_matrix_norm(self.matrix, (0, (1000-font.char_disp(cid))*fontsize*.001)) (_,disp) = apply_matrix_norm(self.matrix, (0, (1000-font.char_disp(cid))*fontsize*.001))
(dx,dy) = apply_matrix_norm(self.matrix, (size,adv)) (dx,dy) = apply_matrix_norm(self.matrix, (size,adv))
tx -= dx/2 tx -= dx/2
ty += disp ty += disp
self.adv = (0, dy)
bbox = (tx, ty+dy, tx+dx, ty) bbox = (tx, ty+dy, tx+dx, ty)
self.fontsize = max(apply_matrix_norm(self.matrix, (size,size))) self.fontsize = max(apply_matrix_norm(self.matrix, (size,size)))
LayoutItem.__init__(self, bbox) LayoutItem.__init__(self, bbox)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
import sys import sys
from pdfminer.utils import mult_matrix, translate_matrix, apply_matrix_norm from pdfminer.utils import mult_matrix, translate_matrix
from pdfminer.pdffont import PDFUnicodeNotDefined from pdfminer.pdffont import PDFUnicodeNotDefined
@ -78,9 +78,11 @@ class PDFTextDevice(PDFDevice):
fontsize, charspace, scaling, chars) fontsize, charspace, scaling, chars)
x += dx x += dx
y += dy y += dy
(dx,dy) = apply_matrix_norm(matrix, (-obj*dxscale,0)) d = -obj*dxscale
x += dx if font.is_vertical():
y += dy y += d
else:
x += d
chars = [] chars = []
else: else:
for cid in font.decode(obj): for cid in font.decode(obj):
@ -95,9 +97,10 @@ class PDFTextDevice(PDFDevice):
fontsize, charspace, scaling, chars) fontsize, charspace, scaling, chars)
x += dx x += dx
y += dy y += dy
(dx,dy) = apply_matrix_norm(matrix, (wordspace,0)) if font.is_vertical():
x += dx y += wordspace
y += dy else:
x += wordspace
chars = [] chars = []
if chars: if chars:
(dx,dy) = self.render_chars(translate_matrix(matrix, (x,y)), font, (dx,dy) = self.render_chars(translate_matrix(matrix, (x,y)), font,

View File

@ -12,7 +12,7 @@ from pdfminer.psparser import PSException, PSTypeError, PSEOF, \
from pdfminer.pdftypes import PDFException, PDFStream, PDFObjRef, \ from pdfminer.pdftypes import PDFException, PDFStream, PDFObjRef, \
resolve1, int_value, float_value, num_value, \ resolve1, int_value, float_value, num_value, \
str_value, list_value, dict_value, stream_value str_value, list_value, dict_value, stream_value
from pdfminer.utils import choplist, mult_matrix, translate_matrix, MATRIX_IDENTITY from pdfminer.utils import choplist, mult_matrix, MATRIX_IDENTITY
from pdfminer.pdffont import PDFFontError, PDFType1Font, PDFTrueTypeFont, PDFType3Font, PDFCIDFont from pdfminer.pdffont import PDFFontError, PDFType1Font, PDFTrueTypeFont, PDFType3Font, PDFCIDFont
from pdfminer.pdfparser import PDFDocument, PDFParser, PDFPasswordIncorrect from pdfminer.pdfparser import PDFDocument, PDFParser, PDFPasswordIncorrect
from pdfminer.pdfcolor import PDFColorSpace, PREDEFINED_COLORSPACE, \ from pdfminer.pdfcolor import PDFColorSpace, PREDEFINED_COLORSPACE, \

View File

@ -13,7 +13,7 @@ def mult_matrix((a1,b1,c1,d1,e1,f1), (a0,b0,c0,d0,e0,f0)):
a0*e1+c0*f1+e0, b0*e1+d0*f1+f0) a0*e1+c0*f1+e0, b0*e1+d0*f1+f0)
def translate_matrix((a,b,c,d,e,f), (x,y)): def translate_matrix((a,b,c,d,e,f), (x,y)):
return (a,b,c,d,e+x,f+y) return (a,b,c,d,x*a+y*c+e,x*b+y*d+f)
def apply_matrix_pt((a,b,c,d,e,f), (x,y)): def apply_matrix_pt((a,b,c,d,e,f), (x,y)):
'''Applies a matrix to a point.''' '''Applies a matrix to a point.'''