5

画像を含む一部の製品の PDF を作成しています。これらの画像の多くは白い背景を持っているので、それらの周りに境界線を追加したいと思います. PDF を作成するときに画像の URL が与えられます。これを reportlab の Image() に直接渡すと、問題なく表示されます。その周りに境界線ができているのが難しいところです。

ReportLab のユーザーガイドを調べた後、Image() には境界線を直接適用する機能がありません。そのため、画像の周りの境界線をシミュレートできるかどうかを確認しようと思ったいくつかのトリックがあります.

最初は、各画像のフレームを作成するのは面倒なだけでなく、フレームの境界線はデバッグ用の黒い実線であり、カスタマイズすることはできません. 境界線の太さと色を変更できるようにしたいので、そのオプションは有望ではありません。

次に、Paragraph() が、境界線を含む特定のスタイルを適用できる ParagraphStyle() を取ることができることに気付きました。Image() には ParagraphStyle() に相当するものがないので、私が持っている画像の URL を含む XML 'img' タグを含む文字列を作成することで、代わりに Paragraph() を使用できると考え、次に ParagraphStyle() を適用します。ボーダー付きです。そのアプローチは画像を正常に表示しますが、まだ境界線はありません:(以下の簡単なコード例:

from reportlab.platypus import Paragraph
from reportlab.lib.styles import Paragraph Style

Paragraph(
    text='<img src="http://placehold.it/150x150.jpg" width="150" height="150" />',
    style=ParagraphStyle(
        name='Image',
        borderWidth=3,
        borderColor=HexColor('#000000')
    )
)

また、XML に境界線のスタイルをインライン化する方法があるかどうかを検索しようとしましたが、何も見つかりませんでした。

どんな提案でも大歓迎です!ありがとう :) もしそうなら、それが不可能な場合でも教えてください!

解決:

G Gordon Worley IIIのアイデアで、うまくいく解決策を書くことができました! 次に例を示します。

from reportlab.platypus import Table

img_width = 150
img_height = 150
img = Image(filename='url_of_img_here', width=img_width, height=img_height)
img_table = Table(
    data=[[img]],
    colWidths=img_width,
    rowHeights=img_height,
    style=[
        # The two (0, 0) in each attribute represent the range of table cells that the style applies to. Since there's only one cell at (0, 0), it's used for both start and end of the range
        ('ALIGN', (0, 0), (0, 0), 'CENTER'),
        ('BOX', (0, 0), (0, 0), 2, HexColor('#000000')), # The fourth argument to this style attribute is the border width
        ('VALIGN', (0, 0), (0, 0), 'MIDDLE'),
    ]
)

次にimg_table、flowables のリストに追加するだけです :)

4

1 に答える 1