2013-08-07 22 views
5

Mục tiêu chính của tôi là có tất cả lưu lượng hình ảnh trên một trang để hoạt động như thể chúng là các liên kết có thể nhấp. Để thực hiện điều này, tôi sẽ tạo canvas.linkRect() và đặt nó trên Hình ảnh được hiển thị. Dưới đây là một ví dụ về cách tôi sử dụng canvas.linkRect():Có thể lấy vị trí tọa độ của Flowable khi nó được kết xuất bằng ReportLab.platypus không?

canvas.linkURL(
    url='url_goes_here', 
    rect=(x1, y1, x2, y2), #(x1, y1) is the bottom left coordinate of the rectangle, (x2, y2) is the top right 
    thickness=0, relative=1 
) 

Sau khi xem trong lớp BaseDocTemplate, tôi tìm thấy một phương pháp gọi là afterFlowable (tự, chaûy). Tôi overrode rằng phương pháp và kêu gọi dir() trên chaûy qua tại, kết quả là đây:

['__call__', '__doc__', '__init__', '__module__', '_doctemplateAttr', 
'_drawOn', '_fixedHeight', '_fixedWidth', '_frameName', '_hAlignAdjust', 
'_showBoundary', '_traceInfo', 'action', 'apply', 'draw', 'drawOn', 'encoding', 
'getKeepWithNext', 'getSpaceAfter', 'getSpaceBefore', 'hAlign', 'height', 
'identity', 'isIndexing', 'locChanger', 'minWidth', 'split', 'splitOn', 'vAlign', 
'width', 'wrap', 'wrapOn', 'wrapped'] 

Nó có chiều rộng và thuộc tính chiều cao tôi có thể sử dụng để xác định lớn như thế nào linkRect() nên được (những gì x2 và y2 nên), nhưng không có thông tin về nơi bắt đầu có thể chảy (cần x1 và y1 là gì?).

Nếu mọi thứ khác không thành công, tôi nghĩ bằng cách nào đó ghép nối một Frame và Image Flowable với nhau vì Frame có thông tin tôi muốn tạo một liên kết(). Tuy nhiên, có vẻ như nó sẽ là một rắc rối để biết khi nào và làm thế nào để đặt hàng một danh sách các khung với danh sách tương ứng của Flowables, trên đầu trang của việc phải biết chính xác nơi để đưa những khung hình ảnh. Có cách nào khác để đạt được điều này hay không?

Cảm ơn!

Trả lời

8

Sau khi làm việc này cả ngày hôm nay, cuối cùng tôi đã tìm ra cách tốt để làm điều này! Dưới đây là cách tôi đã làm điều đó cho bất kỳ ai khác, những người muốn tính năng này của lưu lượng hình ảnh siêu liên kết trong tệp PDF của họ.

Về cơ bản, reportlab.platypus.flowables có một lớp được gọi là FlowableImage kế thừa từ đó. Lưu lượng có phương thức được gọi là drawOn(self, canvas, x, y, _sW=0) mà tôi ghi đè trong một lớp mới mà tôi đã tạo được gọi là HyperlinkedImage.

from reportlab.platypus import Image 

class HyperlinkedImage(Image, object): 

    # The only variable I added to __init__() is hyperlink. I default it to None for the if statement I use later. 
    def __init__(self, filename, hyperlink=None, width=None, height=None, kind='direct', mask='auto', lazy=1): 
     super(HyperlinkedImage, self).__init__(filename, width, height, kind, mask, lazy) 
     self.hyperlink = hyperlink 

    def drawOn(self, canvas, x, y, _sW=0): 
     if self.hyperlink: # If a hyperlink is given, create a canvas.linkURL() 
      x1 = self.hAlignAdjust(x, _sW) # This is basically adjusting the x coordinate according to the alignment given to the flowable (RIGHT, LEFT, CENTER) 
      y1 = y 
      x2 = x1 + self._width 
      y2 = y1 + self._height 
      canvas.linkURL(url=self.hyperlink, rect=(x1, y1, x2, y2), thickness=0, relative=1) 
     super(HyperlinkedImage, self).drawOn(canvas, x, y, _sW) 

Bây giờ thay vì tạo một reportlab.platypus.Image như flowable hình ảnh của bạn, sử dụng HyperlinkedImage mới thay :)