前提・実現したいこと
こちらのサイトでPDF出力を実装しています。
サイトでは、登録されてある全てをPDF出力していますが、一つずつPDF出力を行いたいです。
id_array = list(Work.objects.all().values_list('pk', flat=True))
全て取得
↓変更後
id_array = list(Work.objects.filter(pk=1).values_list('pk', flat=True))
変更後のコードだと一つだけPDF化ができました。
1
の部分を変数(works/<int:pk>/
)にするにはどうすれば良いでしょうか?
該当のソースコード
python
1from django.urls import path 2from . import views 3 4app_name = 'works' 5 6urlpatterns = [ 7 # トップ画面(一覧画面) 8 path('', views.ListView.as_view(), name='index'), 9 10 # 詳細画面 11 path('works/<int:pk>/', views.DetailView.as_view(), name='detail'), 12 13 # 登録画面 14 path('create/', views.CreateView.as_view(), name='create'), 15 16 # PDF出力 17 path('pdf/', views.BasicPdf.as_view(), name='pdf'), 18]
python
1#views.py 2from reportlab.pdfgen import canvas 3from reportlab.pdfbase.cidfonts import UnicodeCIDFont 4from reportlab.pdfbase import pdfmetrics 5from reportlab.lib.utils import ImageReader 6from reportlab.lib.pagesizes import A4 7from reportlab.lib.pagesizes import portrait 8from reportlab.lib.units import mm 9from reportlab.platypus import Table 10from reportlab.platypus import TableStyle 11from reportlab.lib import colors 12from django.http import HttpResponse 13class BasicPdf(generic.View): 14 filename = 'photo_work.pdf' # 出力ファイル名 15 title = 'title: Art Works' 16 font_name = 'HeiseiKakuGo-W5' # フォント 17 is_bottomup = True 18 def get(self, request, *args, **kwargs): 19 # PDF出力 20 response = HttpResponse(status=200, content_type='application/pdf') 21 # response['Content-Disposition'] = 'attachment; filename="{}"'.format(self.filename) # ダウンロードする場合 22 response['Content-Disposition'] = 'filename="{}"'.format(self.filename) # 画面に表示する場合 23 # A4縦書きのpdfを作る 24 size = portrait(A4) 25 # pdfを描く場所を作成:位置を決める原点は左上にする(bottomup) 26 # デフォルトの原点は左下 27 p = canvas.Canvas(response, pagesize=size, bottomup=self.is_bottomup) 28 pdfmetrics.registerFont(UnicodeCIDFont(self.font_name)) 29 p.setFont(self.font_name, 16) # フォントを設定 30 # pdfのタイトルを設定 31 p.setTitle(self.title) 32 # 全ての作品情報を出力する。(検索結果は無関係) 33 id_array = list(Work.objects.filter(pk=1).values_list('pk', flat=True)) 34 for work_count, work_id in enumerate(id_array): 35 logger.debug(work_count) 36 if Image.objects.filter(work_id=work_id).exists(): # 画像が紐づく場合 37 # 作品に紐づく画像パスを取得 38 image = Image.objects.values_list('image', flat=True).get(work_id=work_id) 39 else: 40 # No Imageパス 41 image = settings.MEDIA_URL + NO_IMAGE 42 # 作品情報 43 workInfo = Work.objects.filter(pk=work_id).first() 44 # 表の情報 45 data = [ 46 ['タイトル', workInfo.title, 'メモ', workInfo.memo], 47 ] 48 table = Table(data, (15 * mm, 50 * mm, 12 * mm, 50 * mm), None, hAlign='CENTER') 49 # TableStyleを使って、Tableの装飾をします。 50 table.setStyle(TableStyle([ 51 # 表で使うフォントとそのサイズを設定 52 ('FONT', (0, 0), (-1, -1), self.font_name, 9), 53 # 四角に罫線を引いて、0.5の太さで、色は黒 54 ('BOX', (0, 0), (-1, -1), 1, colors.black), 55 # 四角の内側に格子状の罫線を引いて、0.25の太さで、色は黒 56 ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), 57 # セルの縦文字位置 58 ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), 59 ("ALIGN", (0, 0), (-1, -1), "CENTER"), 60 ('TEXTCOLOR', (0, 0), (0, 0), colors.darkblue), 61 ('TEXTCOLOR', (2, 0), (2, 0), colors.darkblue), 62 ])) 63 if work_count % 2 == 0: # 偶数の場合 64 # 画像の描画 65 p.drawImage(ImageReader(image[1:]), 10, 530, width=580, height=280, mask='auto', 66 preserveAspectRatio=True) 67 # tableを描き出す位置を指定 68 table.wrapOn(p, 50 * mm, 50 * mm) 69 table.drawOn(p, 43 * mm, 160 * mm) 70 else: # 奇数の場合 71 # 画像の描画 72 p.drawImage(ImageReader(image[1:]), 10, 130, width=580, height=280, mask='auto', 73 preserveAspectRatio=True) 74 # tableを描き出す位置を指定 75 table.wrapOn(p, 50 * mm, 50 * mm) 76 table.drawOn(p, 43 * mm, 19 * mm) 77 p.showPage() # Canvasに書き込み(改ページ) 78 if len(id_array) % 2 != 0: # 出力作品数が奇数の場合 79 p.showPage() # Canvasに書き込み 80 p.save() # ファイル保存 81 self._draw(p) 82 return response 83 def _draw(self, p): 84 pass
必要なものがあれば追記したしますのでよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 08:48