From 2ed6b905519cd9b6beaaaf08f8c23cf632b97fae Mon Sep 17 00:00:00 2001 From: "yusuke.shinyama.dummy" Date: Sat, 3 Oct 2009 04:36:54 +0000 Subject: [PATCH] text rotation handling fixed. git-svn-id: https://pdfminerr.googlecode.com/svn/trunk/pdfminer@137 1aa58f4a-7d42-0410-adbc-911cccaed67c --- pdfminer/layout.py | 9 ++++----- pdfminer/pdfdevice.py | 17 ++++++++++------- pdfminer/pdfinterp.py | 2 +- pdfminer/utils.py | 2 +- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/pdfminer/layout.py b/pdfminer/layout.py index bbbda88..de6c452 100644 --- a/pdfminer/layout.py +++ b/pdfminer/layout.py @@ -266,29 +266,28 @@ class LTTextItem(LayoutItem, LTText): assert chars self.matrix = matrix self.font = font - (_,_,_,_,tx,ty) = self.matrix - self.vertical = self.font.is_vertical() + self.vertical = font.is_vertical() self.text = ''.join( char for (char,_) in chars ) adv = sum( font.char_width(cid) for (_,cid) in chars ) adv = (adv * fontsize + len(chars)*charspace) * scaling #size = (font.get_ascent() - font.get_descent()) * fontsize size = font.get_size() * fontsize + (_,_,_,_,tx,ty) = self.matrix if not self.vertical: # horizontal text - self.vertical = False + self.adv = (adv, 0) (dx,dy) = apply_matrix_norm(self.matrix, (adv,size)) (_,descent) = apply_matrix_norm(self.matrix, (0,font.get_descent() * fontsize)) ty += descent - self.adv = (dx, 0) bbox = (tx, ty, tx+dx, ty+dy) else: # vertical text + self.adv = (0, adv) (_,cid) = chars[0] (_,disp) = apply_matrix_norm(self.matrix, (0, (1000-font.char_disp(cid))*fontsize*.001)) (dx,dy) = apply_matrix_norm(self.matrix, (size,adv)) tx -= dx/2 ty += disp - self.adv = (0, dy) bbox = (tx, ty+dy, tx+dx, ty) self.fontsize = max(apply_matrix_norm(self.matrix, (size,size))) LayoutItem.__init__(self, bbox) diff --git a/pdfminer/pdfdevice.py b/pdfminer/pdfdevice.py index 0df67bd..03242f4 100644 --- a/pdfminer/pdfdevice.py +++ b/pdfminer/pdfdevice.py @@ -1,7 +1,7 @@ #!/usr/bin/env python 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 @@ -78,9 +78,11 @@ class PDFTextDevice(PDFDevice): fontsize, charspace, scaling, chars) x += dx y += dy - (dx,dy) = apply_matrix_norm(matrix, (-obj*dxscale,0)) - x += dx - y += dy + d = -obj*dxscale + if font.is_vertical(): + y += d + else: + x += d chars = [] else: for cid in font.decode(obj): @@ -95,9 +97,10 @@ class PDFTextDevice(PDFDevice): fontsize, charspace, scaling, chars) x += dx y += dy - (dx,dy) = apply_matrix_norm(matrix, (wordspace,0)) - x += dx - y += dy + if font.is_vertical(): + y += wordspace + else: + x += wordspace chars = [] if chars: (dx,dy) = self.render_chars(translate_matrix(matrix, (x,y)), font, diff --git a/pdfminer/pdfinterp.py b/pdfminer/pdfinterp.py index c666744..7982c62 100644 --- a/pdfminer/pdfinterp.py +++ b/pdfminer/pdfinterp.py @@ -12,7 +12,7 @@ from pdfminer.psparser import PSException, PSTypeError, PSEOF, \ from pdfminer.pdftypes import PDFException, PDFStream, PDFObjRef, \ resolve1, int_value, float_value, num_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.pdfparser import PDFDocument, PDFParser, PDFPasswordIncorrect from pdfminer.pdfcolor import PDFColorSpace, PREDEFINED_COLORSPACE, \ diff --git a/pdfminer/utils.py b/pdfminer/utils.py index 75e65b6..42aeef5 100644 --- a/pdfminer/utils.py +++ b/pdfminer/utils.py @@ -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) 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)): '''Applies a matrix to a point.'''