{"title":"Django를 사용하여 PDF를 출력합니다.","version":"3.1","locale":"ko","docname":"howto/outputting-pdf","url":"/ko/3.1/howto/outputting-pdf/","canonical":"https://djangodocs.dev/ko/3.1/howto/outputting-pdf/","summary":"이 문서에서는 Django 보기를 사용하여 PDF 파일을 동적으로 출력하는 방법을 설명합니다. 이는 우수한 오픈 소스 ReportLab_Python PDF 라이브러리를 통해 가능합니다. PDF 파일을 동적으로 생성할 수 있는 이점은 사용자나 컨텐츠의 다양한 용도로 사용자 정의된 PDF를 생성할…","html":"<h1>Django를 사용하여 PDF를 출력합니다.<a class=\"heading-anchor\" href=\"#outputting-pdfs-with-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>이 문서에서는 Django 보기를 사용하여 PDF 파일을 동적으로 출력하는 방법을 설명합니다. 이는 우수한 오픈 소스 ReportLab_Python PDF 라이브러리를 통해 가능합니다.</p>\n<p>PDF 파일을 동적으로 생성할 수 있는 이점은 사용자나 컨텐츠의 다양한 용도로 사용자 정의된 PDF를 생성할 수 있다는 것입니다.</p>\n<p>예를 들어, Django는 kusports.com_에서 3월 Madness 대회에 참가하는 사람들을 위해 PDF 파일로 사용자 정의되고 프린터 친화적인 NCAA 토너먼트 브래킷을 생성하는 데 사용되었습니다.</p>\n<section id=\"install-reportlab\">\n<h2>ReportLab을 설치합니다.<a class=\"heading-anchor\" href=\"#install-reportlab\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>ReportLab 라이브러리는 PyPI에서 사용할 수 있습니다. 사용자 가이드(PDF 파일)도 다운로드할 수 있습니다. “pip”로 ReportLab을 설치할 수 있습니다.</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>reportlab\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m pip install reportlab\n</code></pre></div></div></div>\n<p>Python 대화형 인터프리터를 사용하여 설치를 테스트합니다.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">reportlab</span>\n</code></pre></div>\n<p>해당 명령으로 인해 오류가 발생하지 않으면 설치가 작동했습니다.</p>\n</section>\n<section id=\"write-your-view\">\n<h2>당신의 견해를 쓰시오.<a class=\"heading-anchor\" href=\"#write-your-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django를 사용하여 PDF를 동적으로 생성하기 위한 핵심은 ReportLab API가 파일과 유사한 개체에 대해 작동하고 Django의 :class:’~django.the’ 입니다.파일 응답’ 개체는 파일 유사 개체를 수락합니다.</p>\n<p>다음은 “Hello World”의 예입니다.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">io</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FileResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">reportlab.pdfgen</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">canvas</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Create a file-like buffer to receive PDF data.</span>\n    <span class=\"n\">buffer</span> <span class=\"o\">=</span> <span class=\"n\">io</span><span class=\"o\">.</span><span class=\"n\">BytesIO</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># Create the PDF object, using the buffer as its &quot;file.&quot;</span>\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">canvas</span><span class=\"o\">.</span><span class=\"n\">Canvas</span><span class=\"p\">(</span><span class=\"n\">buffer</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Draw things on the PDF. Here&#39;s where the PDF generation happens.</span>\n    <span class=\"c1\"># See the ReportLab documentation for the full list of functionality.</span>\n    <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">drawString</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">,</span> <span class=\"mi\">100</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Hello world.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Close the PDF object cleanly, and we&#39;re done.</span>\n    <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">showPage</span><span class=\"p\">()</span>\n    <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># FileResponse sets the Content-Disposition header so that browsers</span>\n    <span class=\"c1\"># present the option to save the file.</span>\n    <span class=\"n\">buffer</span><span class=\"o\">.</span><span class=\"n\">seek</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">FileResponse</span><span class=\"p\">(</span><span class=\"n\">buffer</span><span class=\"p\">,</span> <span class=\"n\">as_attachment</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">filename</span><span class=\"o\">=</span><span class=\"s1\">&#39;hello.pdf&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>코드와 코멘트는 자명해야 하지만 몇 가지 사항은 언급할 가치가 있습니다.</p>\n<ul class=\"simple\">\n<li><p>응답은 파일 이름 확장자에 따라 자동으로 MIME 유형:mimtype:’application/pdf’를 설정합니다. 이것은 브라우저에게 문서가 HTML 파일이나 일반적인 :mimetype:’application/octet-stream’ 바이너리 콘텐츠가 아닌 PDF 파일임을 알려줍니다.</p></li>\n<li><p>“as_attachment = True”가 “파일 응답”으로 전달되면 적절한 “내용-분산” 헤더를 설정하고 웹 브라우저가 컴퓨터에 디폴트가 설정되어 있더라도 문서 처리 방법을 묻는 대화 상자를 열도록 지시합니다. “as_attachment” 매개 변수가 생략되면 브라우저는 PDF에 사용하도록 구성된 모든 프로그램/플러그인을 사용하여 PDF를 처리합니다.</p></li>\n<li><p>임의의 “파일 이름” 매개 변수를 제공할 수 있습니다. 브라우저가 “다른 이름으로 저장…”에서 사용합니다.” 대화 상자입니다.</p></li>\n<li><p>ReportLab API에 연결할 수 있습니다. “캔버스”에 대한 첫 번째 주장과 같은 완충장치가 통과되었습니다.캔버스’는 :class에 제공할 수 있습니다.’~django.the’ 입니다.파일 응답 클래스입니다.</p></li>\n<li><p>이후의 모든 PDF 생성 방법은 “버퍼”가 아닌 PDF 객체(이 경우 “p”)로 호출됩니다.</p></li>\n<li><p>마지막으로 PDF 파일로 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>쇼 페이지”와 “저장(save)”을 부르는 것이 중요합니다.</p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p>ReportLab은 스레드 세이프가 아닙니다. 일부 사용자가 PDF 생성 Django 뷰를 구축하는 과정에서 여러 사용자가 동시에 액세스할 수 있는 이상한 문제가 발생했다고 보고했습니다.</p>\n</aside>\n</section>\n<section id=\"other-formats\">\n<h2>다른 포맷<a class=\"heading-anchor\" href=\"#other-formats\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>이러한 예에서는 PDF에 특정한 것이 많지 않으며 단지 “보고서 실험실”을 사용한 일부입니다. 유사한 기술을 사용하여 Python 라이브러리를 찾을 수 있는 임의 형식을 생성할 수 있습니다. 또한 다른 예와 텍스트 기반 형식을 생성할 때 사용할 수 있는 몇 가지 기법은 :doc:’/how to/outputing-csv’를 참조하십시오.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">더 보기</p>\n<p>Django Package는 Django에서 PDF 파일을 생성하는 데 도움이 되는 ‘packages <a class=\"reference external\" href=\"https://djangopackages.org/grids/g/pdf/\">https://djangopackages.org/grids/g/pdf/</a>’을 제공합니다.</p>\n</aside>\n</section>","rootId":"outputting-pdfs-with-django","toc":[{"title":"ReportLab을 설치합니다.","anchor":"install-reportlab","children":[]},{"title":"당신의 견해를 쓰시오.","anchor":"write-your-view","children":[]},{"title":"다른 포맷","anchor":"other-formats","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"“How-to” 가이드","url":"/ko/3.1/howto/"}],"prev":{"docname":"howto/outputting-csv","title":"장고에서 CSV 출력하기","url":"/ko/3.1/howto/outputting-csv/"},"next":{"docname":"howto/overriding-templates","title":"템플릿을 재정의","url":"/ko/3.1/howto/overriding-templates/"},"formats":{"html":"/ko/3.1/howto/outputting-pdf/","markdown":"/ko/3.1/howto/outputting-pdf.md","json":"/ko/3.1/howto/outputting-pdf.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/howto/outputting-pdf.txt","official":"https://docs.djangoproject.com/ko/3.1/howto/outputting-pdf/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}