본문 바로가기
DJango

DJango - 특정 pdf페이지를 웹 페이지로 출력하기

by 지식을 쌓는 개구리 2024. 7. 24.

여는 글

입학지원팀 llm프로젝트를 진행하면서 특정 pdf 페이지를 웹페이지로 출력하는 기능이 필요해, 이를 구현한 기록을 하려

이 글을 쓰게되었다.

원하는 pdf페이지를 웹 페이지에 바로 띄워보는 간단한 코드를 작성해보자

 

코드

1. media 루트 설정

- settings.py

MEDIA_URL = "media/"
MEDIA_ROOT = BASE_DIR / "media"

- urls.py

urlpatterns = [
    re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
    path(r'swagger', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    path(r'redoc', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc-v1'),
    # main
    path("admin/", admin.site.urls),
    path("maruegg/", include("maruegg.urls")),
    path("accounts/", include("accounts.urls")),
    path("", TemplateView.as_view(template_name="base.html"), name="root"),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

=> 다음과 같이 파일처리를 위해서 media관련 settings.py설정과 본 프로젝트 urls.py 설정을 진행하자.

 

2. media폴더에 test할 pdf파일 드래그앤드롭

=> 이렇게 media/files 안에 test할 pdf파일을 두자

 

3. view 생성

def pdf_link(request, page=1):
    pdf_url = os.path.join(settings.MEDIA_URL, 'files/2024정시모집요강.pdf')
    return render(request, 'maruegg/pdf_link.html', {'pdf_url': pdf_url, 'page': page})

=> 이렇게 뷰를 작성하고

=> 이렇게 url설정해준다.

 

4. pdf_link.html작성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PDF Link Example</title>
</head>
<body>
    <h1>PDF Link Example</h1>
    <a href="{{ pdf_url }}#page={{ page }}" target="_blank">{{ page }} 페이지로 이동하기</a>
</body>
</html>

=> test할 html파일도 만들어준다.

 

결과

 

=> pdf_link/10->(특정 이동하고 싶은 페이지 아무거나) 로 url입력하고 아래 하이퍼링크를 클릭하면

=> 정상적으로 페이지 이동이 가능하다!!

 

html파일을 거치지 않고 다이렉트 연결을 원한다면?

def pdf_direct_link(request, page):
    pdf_url = os.path.join(settings.MEDIA_URL, 'files/2024정시모집요강.pdf')
    full_url = f"{pdf_url}#page={page}"
    logger.debug(f"Redirect page: {full_url}")
    return redirect(full_url)

=> 이 코드를 사용하면 된다.