Python 및 xhtml2pdf를 사용하여 PDF 만들기

16436 단어 htmlpythontutorialpdf
안녕하세요 여러분!. 이 게시물에서는 Python 및 xhtml2pdf을 사용하여 pdf 파일을 만드는 방법을 보여주는 작은 가이드를 공유하고 싶습니다.

xhtml2pdf lib는 HTML 파일에서 pdf 파일을 만드는 데 사용됩니다. 제가 직접 만든 가이드일 뿐이지만 여러분과 공유하고 싶습니다.

경고: 또한 이것은 실험 목적으로 수행한 가이드이며 프로덕션 환경에서 사용하지 않았습니다. 따라서 프로덕션에서 사용하는 데 문제가 있을 수 있음을 염두에 두어야 합니다. PDF 파일을 만드는 더 나은 대안은 http://weasyprint.org/ 입니다.

요구 사항



  • Python (Python 3.8.2 사용)
  • 핍(Pip 20.1.1 사용)

  • 설정 프로젝트



    프로젝트를 생성하기 위해 virtualenv 을 사용하여 이 프로젝트에 대해 격리된 파이썬 환경을 생성할 것입니다. 그러나 pyenv 또는 venv 을 사용할 수도 있습니다.

    따라서 먼저 venv를 설치해야 합니다.

    pip3 install virtualenv
    


    이제 프로젝트 폴더를 만들고 virtualenv를 설정해야 합니다.

    # Creating a project folder
    mkdir pdfs-example
    cd pdfs-example
    
    # Creating the virtual environment
    virtualenv env
    
    # Activate the virtual environment
    source env/bin/activate
    
    # Create our main file
    touch main.py
    


    참고: 환경을 종료하려면 deactivate 를 작성하면 됩니다.

    종속성 설치



    PDF 파일을 생성하려면 xhtml2pdf 라이브러리를 설치해야 합니다. 이 라이브러리는 html5libreportlab 에도 의존합니다.

    pip install reportlab # https://pypi.org/project/reportlab/
    pip install html5lib # https://pypi.org/project/html5lib/
    pip install xhtml2pdf
    


    참고: Python3에서 작업하려면 0.1a1보다 높은 xhtml2pdf 버전이 필요합니다.

    다음 명령을 사용하여 설치된 종속성을 볼 수 있습니다.

    # Installed dependencies
    pip freeze
    
    # The above mentioned command will list something like the following
    html5lib==1.1
    Pillow==7.2.0
    PyPDF2==1.26.0
    reportlab==3.5.50
    six==1.15.0
    webencodings==0.5.1
    xhtml2pdf==0.2.4
    


    의존성을 내보낼 수도 있습니다.

    pip freeze > requirements.txt
    


    그리고 requirements.txt 파일에서 종속 항목을 설치합니다.

    pip install -r requirements.txt
    


    문자열에서 PDF 생성



    이제 필요한 모듈을 설치했으므로 코드 작성을 시작할 수 있습니다. 먼저 PDF 파일을 만드는 데 도움이 되는 xhtml2pdf 모듈을 가져와야 합니다.

    # main.py
    # import section ....
    from xhtml2pdf import pisa             # import python module
    # ....
    


    이제 몇 가지 상수를 정의할 수 있습니다.

    # main.py
    
    # Constants section ....
    # Content to write in our PDF file.
    SOURCE = "<html><body><p>PDF from string</p></body></html>"
    
    # Filename for our PDF file.
    OUTPUT_FILENAME = "test.pdf"
    # ....
    


    좋아, 우리는 다른 함수에서 재사용하고 코드 중복을 피하기 위해 기본 함수를 만들 것입니다.

    # main.py
    
    # Methods section ....
    def html_to_pdf(content, output):
        """
        Generate a pdf using a string content
    
        Parameters
        ----------
        content : str
            content to write in the pdf file
        output  : str
            name of the file to create
        """
        # Open file to write
        result_file = open(output, "w+b") # w+b to write in binary mode.
    
        # convert HTML to PDF
        pisa_status = pisa.CreatePDF(
                content,                   # the HTML to convert
                dest=result_file           # file handle to recieve result
        )           
    
        # close output file
        result_file.close()
    
        result = pisa_status.err
    
        if not result:
            print("Successfully created PDF")
        else:
            print("Error: unable to create the PDF")    
    
        # return False on success and True on errors
        return result
    
    # ....
    


    기본 기능이 있으면 from_text 기능을 만들 수 있습니다.

    # main.py
    
    # Methods section ....
    def from_text(source, output):
        """
        Generate a pdf from a plain string
    
        Parameters
        ----------
        source : str
            content to write in the pdf file
        output  : str
            name of the file to create
        """
        html_to_pdf(source, output)
    
    # ....
    


    우리의 main 기능은 다음과 같습니다.

    # main.py
    # import section ....
    import sys
    
    # Main section ...
    if __name__ == "__main__":
        if len(sys.argv)> 1 :
            if sys.argv[1] == '--help':
                print('Info: ')
                print('--help List the options to send an email')
                print('--text Create a PDF file from a string')
                print('--template Create a PDF file from a template')
            elif sys.argv[1] == '--text':
                print("Creating a PDF file from a string")
                from_text(SOURCE, OUTPUT_FILENAME)
        else:
            print("Please give the type of message to send.")
            print("For help execute `python main.py --help`")
    


    터미널에서 다음 명령을 실행하여 기능을 테스트할 수 있습니다.

    python main.py --text
    
    # Creating a PDF file from a string
    # Successfully created PDF
    




    템플릿에서 PDF 생성



    여기에서는 HTML 템플릿을 사용하여 PDF 파일을 생성합니다. xhtml2pdf은 HTML4까지 지원한다는 점을 명심해야 합니다. 따라서 먼저 PDF 파일의 템플릿 역할을 할 HTML 파일을 만들어야 합니다.

    touch template.html
    


    그리고 우리는 간단한 html 템플릿을 정의할 것입니다.

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>PDF Generator</title>
    </head>
    <body>
        <h1 style="color:red;">First PDF</h1>
        <h2 style="color:blue;">PDF with html template</h2>
        <p>John</p>
        <p>Snow</p>
        <p>35</p>
    </body>
    </html>
    


    템플릿 파일을 정의할 새 상수를 만듭니다.

    # main.py
    
    # Constants section ....
    # Template file name
    TEMPLATE_FILE = "template.html"
    # ....
    


    이제 템플릿을 읽고 PDF 파일을 만드는 기능을 만들 수 있습니다.

    # main.py
    
    # Methods section ....
    def from_template(template, output):
        """
        Generate a pdf from a html file
    
        Parameters
        ----------
        source : str
            content to write in the pdf file
        output  : str
            name of the file to create
        """
        # Reading our template
        source_html = open(template, "r")
        content = source_html.read() # the HTML to convert
        source_html.close() # close template file
    
        html_to_pdf(content, output)
    
    # ....
    


    기본 기능에 옵션을 추가하십시오.

    # main.py
    
    # Main section ...
    if __name__ == "__main__":
        # ....
    
        if len(sys.argv)> 1 :
            # if ....
            elif sys.argv[1] == '--template':
                print("Creating a PDF file from a template")
                from_template(TEMPLATE_FILE, OUTPUT_FILENAME)
        else:
            # ....
    


    터미널에서 다음 명령을 실행하여 기능을 테스트할 수 있습니다.

    python main.py --template
    
    # Creating a PDF file from a template
    # Successfully created PDF
    




    마지막 말



    이 게시물을 읽어 주셔서 감사합니다. 이 가이드의 코드here를 찾을 수 있습니다.

    좋은 웹페이지 즐겨찾기