tcpdf로 게시글을 pdf로 다운로드하기 정보
게시판 tcpdf로 게시글을 pdf로 다운로드하기관련링크
첨부파일
본문
그누보드 게시판의 게시글을 tcpdf를 사용해서 pdf파일로 다운로드 하는 스킨입니다.
tcpdf홈페이지(TCPDF)에서 tcpdf를 다운로드해서 서버의 적당한 위치에 업로드합니다.
tcpdf 파일용량이 55mb정도라서 그누보드 파일첨부로 업로드가 되지않습니다.
tcpdf
tcpdf는 한글이 작동되지 않기때문에
위의 tcpdf의 fonts폴더안에 fonts폴더의 나눔고딕폰트를 업로드해줍니다.
pdf_download폴더를 다운로드해서 압축을 풀면 fonts, basic_original폴더가 나옵니다.
fonts 폴더에는 나눔고딕폰트가 들어있습니다.
basic_original 폴더는 그누보드 pc 스킨의 basic과 같습니다.
list.skin.php, write.skin.php, comment.skin.php, view.skin.php, connect_pdo.php, pdf_download.php파일이 들어있습니다.
view.skin.php에 "PDF다운로드하기" 링크버튼을 추가했습니다.
<!-- 본문 내용 시작 { -->
<div id="bo_v_con"><?php echo get_view_thumbnail($view['content']); ?></div>
<?php //echo $view['rich_content']; //
과 같은 코드를 사용할 경우 ?>
<!-- } 본문 내용 끝 -->
<!-- PDF 다운로드 버튼 -->
<div style="margin-top: 20px; text-align: center;">
<a href="<?php echo G5_URL; ?>/skin/board/basic_original/pdf_download.php?wr_id=<?php echo $wr_id; ?>"
class="btn btn-primary"
style="display: inline-block; padding: 10px 20px; background-color: #007bff; color: #fff; text-decoration: none; border-radius: 5px;">
PDF 다운로드
</a>
</div>
<!-- PDF 다운로드 버튼 -->
다운로드 버튼을 클릭하면 pdf_download.php로 연결되어서 게시글이 pdf로 다운로드됩니다.
pdf_download.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once($_SERVER['DOCUMENT_ROOT'] . "/jubo/tcpdf/tcpdf.php");
include('connect_pdo.php'); // 반드시 echo 없는 파일로 수정!
// PDF 생성 전 절대 출력 금지!
ob_start(); // 출력 버퍼링 시작 (불필요한 출력 방지)
// TCPDF 객체 생성
$pdf = new TCPDF();
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('그누보드');
$pdf->SetTitle('PDF 다운로드');
$pdf->SetSubject('그누보드 게시글 PDF 변환');
$pdf->SetKeywords('그누보드, PDF, 다운로드');
// 한글 폰트 설정 (NanumGothic 폰트 사용)
$pdf->SetFont('nanumgothic', '', 14);
$pdf->SetMargins(10, 10, 10);
$pdf->AddPage();
$post_id = isset($_GET['wr_id']) ? intval($_GET['wr_id']) : 0;
if ($post_id > 0) {
$sql = "SELECT wr_subject, wr_content FROM g5_write_basic_original WHERE wr_id = :wr_id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':wr_id', $post_id, PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row) {
// 제목 출력
$pdf->Cell(0, 10, $row['wr_subject'], 0, 1, 'C');
// 본문 출력 (HTML 적용 가능)
$pdf->SetFont('nanumgothic', '', 12);
$pdf->writeHTML(nl2br($row['wr_content']), true, false, true, false, '');
// 줄바꿈 추가
$pdf->Ln(10);
// 이미지 출력 (g5_board_file 테이블에서 가져오기)
$sql_img = "SELECT bf_file FROM g5_board_file WHERE bo_table = 'basic_original' AND wr_id = :wr_id";
$stmt_img = $pdo->prepare($sql_img);
$stmt_img->bindParam(':wr_id', $post_id, PDO::PARAM_INT);
$stmt_img->execute();
$image_width = 150; // PDF에 출력할 이미지 너비 (mm 단위)
$image_height = 90; // PDF에 출력할 이미지 높이 (mm 단위)
$margin = 10; // 이미지 간격 (mm)
$y_position = $pdf->GetY(); // 현재 Y 좌표 저장
while ($img = $stmt_img->fetch(PDO::FETCH_ASSOC)) {
$image_path = $_SERVER['DOCUMENT_ROOT'] . "/data/file/basic_original/" . $img['bf_file'];
if (file_exists($image_path)) {
// 현재 Y 좌표에서 이미지 출력
$pdf->Image($image_path, 30, $y_position, $image_width, $image_height, '', '', 'T', false, 300, '', false, false, 0, false, false, false);
// 다음 이미지 Y 좌표 조정 (현재 Y + 이미지 높이 + 간격)
$y_position += $image_height + $margin;
} else {
$pdf->Cell(0, 10, "이미지 파일을 찾을 수 없습니다: " . $img['bf_file'], 0, 1, 'C');
}
}
} else {
$pdf->Cell(0, 10, '게시글을 찾을 수 없습니다.', 0, 1, 'C');
}
} else {
$pdf->Cell(0, 10, '잘못된 접근입니다.', 0, 1, 'C');
}
// 출력 버퍼 정리 후 PDF 다운로드
ob_end_clean();
$pdf->Output('download.pdf', 'D');
exit;
?>
위의 코드에서 tcpdf.php을 인클루드하는 것이 핵심입니다.
require_once($_SERVER['DOCUMENT_ROOT'] . "/jubo/tcpdf/tcpdf.php");
서버 루트기준의 경로를 나타냅니다. http://example.co.kr/jubo/tcpdf/tcpdf.php와 같습니다.
$sql_img = "SELECT bf_file FROM g5_board_file WHERE bo_table = 'basic_original' AND wr_id = :wr_id";
$image_path = $_SERVER['DOCUMENT_ROOT'] . "/data/file/basic_original/" . $img['bf_file'];
에서 노란부분을 본인이 사용하는 게시판이름으로 바꾸시면됩니다.
tcpdf는 그누보드의 db연결을 사용하지 않기때문에 별도로 db와 연결을 시켜주어야합니다.
include('connect_pdf.php');로 연결합니다.
connect_pdo.php에서 본인의 서버와 데이타베이스이름, 사용자이름, 비밀번호를 변경하시면됩니다.
<?php
$host = 'localhost';
$dbname = 'eg*****';
$username = 'eg*****';
$password = 'Tc*****';
try{
$pdo= new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
// 에러 모드를 예외로 설정
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// echo "Connected Successfully!!";
} catch (PDOException $e){
// echo "Connection Failed: ".$e->getMessage();
}
// 연결 종료 (PDO는 null 할당으로 연결 종료)
// $conn = null;
?>
!-->!-->!-->
7
댓글 전체

수고 하셨습니다.
. . .
(tcpdf.php의 위치를 상수로 정의하시면 어떨까 싶습니다)
감사합니다.
상수로 정의하는 것이 어떤지 챗gpt에 물어보니 좋은 방법이라고 합니다.
저는 root에 jubo/tcpdf/tcpdf.php 경로인데요.
tcpdf/tcpdf_config.php에 아래처럼 상수를 정의 했습니다.
// TCPDF 경로를 상수로 정의
define('TCPDF_PATH', $_SERVER['DOCUMENT_ROOT'] . '/jubo/tcpdf/');
상수를 사용하기위해서는 상수가 정의된 파일(tcpdf_config.php)이 먼저 인클루드되어야 하기때문에 다음과 같이 상수를 인클루드합니다.
// TCPDF 설정 파일 로드 (TCPDF_PATH 정의)
require_once($_SERVER['DOCUMENT_ROOT'] . '/jubo/tcpdf/config/tcpdf_config.php');
// TCPDF_PATH가 정의되지 않았다면 오류 메시지 출력 후 종료
if (!defined('TCPDF_PATH')) {
die("오류: TCPDF_PATH가 정의되지 않았습니다. tcpdf_config.php 경로를 확인하세요.");
}
// TCPDF 라이브러리 로드
require_once(TCPDF_PATH . 'tcpdf.php');
* 상수를 사용한 샘플페이지(test.php)
<?php
// TCPDF 설정 파일 로드 (TCPDF_PATH 정의)
require_once($_SERVER['DOCUMENT_ROOT'] . '/jubo/tcpdf/config/tcpdf_config.php');
// TCPDF_PATH가 정의되지 않았다면 오류 메시지 출력 후 종료
if (!defined('TCPDF_PATH')) {
die("오류: TCPDF_PATH가 정의되지 않았습니다. tcpdf_config.php 경로를 확인하세요.");
}
// TCPDF 라이브러리 로드
require_once(TCPDF_PATH . 'tcpdf.php');
// 새로운 PDF 객체 생성
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// 문서 정보 설정
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Your Name');
$pdf->SetTitle('Sample PDF using TCPDF');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, sample, test');
// 페이지 추가
$pdf->AddPage();
// 폰트 설정
$pdf->SetFont('nanumgothic', '', 12);
// PDF에 텍스트 추가
$html = '<h1>TCPDF 샘플 페이지</h1>
<h1>경로 상수 사용하기 테스트</h1>
<p>이것은 TCPDF를 사용하여 생성된 PDF 문서입니다.</p>';
$pdf->writeHTML($html, true, false, true, false, '');
// PDF 출력
$pdf->Output('sample.pdf', 'I');
exit();
?>
유용한 스킨을 공개해주셔서 감사드립니다.
격려의 댓글을 남겨주셔서 감사드립니다.

감사합니다.
감사합니다.^^