HTML을 사용하는 "weasyprint"pdf 생성기 - in django

3048 단어
weasyprint를 사용하는 이유는 무엇입니까?
사용하기 쉬운. 의심할 여지 없이 weasyprint는 pdf 생성기와 관련하여 사용하기 가장 쉬운 라이브러리 중 하나입니다.
빠른 요청. 단순성 때문에 이 라이브러리는 HTML을 PDF로 매우 빠르게 변환하는 경향이 있습니다. (HTML에서 사용하는 도구에 따라 다르며, 링크를 통해 요청을 많이 해야 하는 경우 변환 시간이 길어지는 경향이 있습니다.)

언제 weasyprint를 사용하지 않아야 하나요?
위에서 말했듯이 라이브러리의 단순성으로 인해 최신 스타일 지정 기능이 제대로 작동하지 않을 수 있습니다. 예를 들어 flexbox는 물론 JS도 이 생성기에서 사용할 수 없습니다.



이 글의 제목처럼 HTML에서 pdf 파일을 생성하는 함수를 만드는 방법을 설명할 것이므로 처음부터 시작해보자.

먼저 requirements.txt 파일로 이동하여 다음 코드를 추가해야 합니다.

weasyprint==53.4


프로젝트가 Docker화되고 Linux가 알파인인 경우 Dockerfile에 다음 코드 줄을 포함하는 것이 좋습니다.

RUN apk add --no-cache jpeg-dev zlib-dev git gcc musl-dev python3-dev postgresql-dev
RUN apk add py3-pip py3-pillow py3-cffi py3-brotli gcc musl-dev python3-dev pango
RUN apk add py3-pip gcc musl-dev python3-dev pango zlib-dev jpeg-dev openjpeg-dev g++ libffi-dev
RUN apk add --no-cache --virtual .build-deps build-base linux-headers


이제 함수를 생성할 파일 내에서 다음과 같은 가져오기를 수행해야 합니다.

# to get the current date and time
import datetime
# library import
from weasyprint import HTML


이제 변환기의 논리를 포함하는 함수를 만들 수 있습니다. 다음은 함수를 구성하는 방법의 예입니다.

def export_pdf(request, queryset):
    response = HttpResponse(content_type='aplication/pdf')
    response['Content-Disposition'] = 'attachment; filename=Expense' + \
        str(datetime.datetime.now())+'.pdf'
    response['Content-Transfer-Encoding'] = 'binary'

    query = Query.objects.get(pk=1) #your query with the database object information

    html_string = render_to_string(
        'pdf_template.html',{'templates': query,'total': 0})
    html = HTML(string=html_string) # .html file route

    result = html.write_pdf()

    with tempfile.NamedTemporaryFile(delete=True) as output:
        output.write(result)
        output.flush()

        output = open(output.name, 'rb')
        response.write(output.read())

    return response


기능이 준비되면 변환될 HTML 파일을 만들 수 있습니다. 생성 위치는 사용자에게 달려 있으며 가장 적절한 것은 앱 내부의 템플릿 폴더 안에 생성하는 것입니다. 현재의 경우 생성된 파일의 이름은 pdf_template.html이었습니다.



html 파일의 정보를 처리하기 위해 weasyprint는 jinja와 같은 리소스를 허용하여 쿼리를 처리합니다.

참조:
  • https://weasyprint.org/
  • https://jinja.palletsprojects.com/en/3.0.x/
  • 좋은 웹페이지 즐겨찾기