{"title":"PDF 파일을 만드는 방법","version":"6.0","locale":"ko","docname":"howto/outputting-pdf","url":"/ko/6.0/howto/outputting-pdf/","canonical":"https://djangodocs.dev/ko/6.0/howto/outputting-pdf/","summary":"이 문서에서는 Django 보기를 사용하여 PDF 파일을 동적으로 출력하는 방법을 설명합니다. 이는 우수한 오픈 소스 ReportLab_Python PDF 라이브러리를 통해 가능합니다. PDF 파일을 동적으로 생성할 수 있는 이점은 사용자나 컨텐츠의 다양한 용도로 사용자 정의된 PDF를 생성할…","html":"<h1>PDF 파일을 만드는 방법<a class=\"heading-anchor\" href=\"#how-to-create-pdf-files\"><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 라이브러리는 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">:pypi:`available on PyPI &lt;reportlab&gt;`입니다. `user guide`_</span></a> (PDF 파일)도 다운로드할 수 있습니다. 다음과 같이 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>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=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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\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=\"s2\">&quot;hello.pdf&quot;</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><code class=\"docutils literal notranslate\"><span class=\"pre\">as_attachment=True``가</span> <span class=\"pre\">``FileResponse``에</span> <span class=\"pre\">전달되면,</span> <span class=\"pre\">적절한</span> <span class=\"pre\">``Content-Disposition</span></code> 헤더가 설정되어 이미 기본값이 설정된 기계의 웹브라우저에게 문서 처리 방법을 표시하고 확인하는 대화 상자를 팝업하도록 지시합니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">as_attachment</span></code> 매개변수가 생략된 경우, 브라우저는 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>showPage()”와 “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":"how-to-create-pdf-files","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/6.0/howto/"}],"prev":{"docname":"howto/outputting-csv","title":"CSV로 출력하는 방법","url":"/ko/6.0/howto/outputting-csv/"},"next":{"docname":"howto/overriding-templates","title":"템플릿 재정의 방법","url":"/ko/6.0/howto/overriding-templates/"},"formats":{"html":"/ko/6.0/howto/outputting-pdf/","markdown":"/ko/6.0/howto/outputting-pdf.md","json":"/ko/6.0/howto/outputting-pdf.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/howto/outputting-pdf.txt","official":"https://docs.djangoproject.com/ko/6.0/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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}