안녕하세요... 미니님a입니다. 해당 스킨은 기존의 회원 가입 시 다소 불편했던 부분을 해소한 버전이라 보시면 됩니다. 실제로, 회원 가입을 다하고 이미 있는 아이디다 / 이미...
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다운로드하기" 링크버튼을 추가했습니다.
[code] <!-- 본문 내용 시작 { -->
<div id="bo_v_con"><?php echo get_view_thumbnail($view['content']); ?></div>
<?php //echo $view['rich_content']; // {이미지:0} 과 같은 코드를 사용할 경우 ?>
<!-- } 본문 내용 끝 -->
<!-- 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 다운로드 버튼 -->
[/code]
다운로드 버튼을 클릭하면 pdf_download.php로 연결되어서 게시글이 pdf로 다운로드됩니다.
pdf_download.php
[code]
<?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;
?>
[/code]
위의 코드에서 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에서 본인의 서버와 데이타베이스이름, 사용자이름, 비밀번호를 변경하시면됩니다.
[code]
<?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;
?>
[/code]
버전 정보
첨부파일
그누보드5 스킨
2,751건좋은 댓글과 좋아요는 제작자에게 큰힘이 됩니다.
그누보드 게시판의 게시글을 tcpdf를 사용해서 pdf파일로 다운로드 하는 스킨입니다. tcpdf홈페이지(TCPDF)에서 tcpdf를 다운로드해서 서버의 적당한 위치에 업로드합...
카톡 같은 게시판 입니다. PC 버전에 이어 모바일 버전입니다 목록에서 글쓰기가 가능 합니다. 본인이 쓴 글은 오른쪽 정렬 카토 처럼 배경 노란색 입니다. 다른 사람이 쓴 글은 왼...
음악관련 사항을 db에 저장한 후에 웹에서 재생하는 스킨입니다. 장수, 제목, 음악, 사진, 영상, 가사첫줄, 전체가사를 db에 저장한 후에 웹에서 관련된 사항을 표시하고 제목을 ...
하단 링크의 이모티콘 상점과 연동하여 사용하는 게시판 입니다.(이모티콘 기능은 댓글에서만 작동합니다.) https://sir.kr/g5_plugin/13131 모바일 버전은 따...
카톡 같은 게시판 입니다. 목록에서 글쓰기가 가능 합니다. 본인이 쓴 글은 오른쪽 정렬 카토 처럼 배경 노란색 입니다. 다른 사람이 쓴 글은 왼쪽 배경 흰색 입니다. 답글은 오른쪽...
업뎃되었습니다. - https://sir.kr/g5_skin/61896 ---------- 1. 여분필드 wr_link1 만을 사용합니다. 원칙적으로 주고 싶은 만큼의 ...
게시판의 리스트페이지를 기본형보기, 리스트보기, 앨범보기,웹진보기 가능함~~ 1. 기본형보기 : 기본게시판 리스트타입출력 2. 리스트형보기 : 제목만 리스트로 출력 3. 앨범...
코멘트를 리스트 페이지에서 작성하여 방명록 형식으로 출력되도록 함~ 1. 코멘트를 리스트에서 작성하여 출력 2. 코멘트 작성할때 파일첨부 기능추가(멀티업로드 가능, 이미지가능,...
기존에 업로드 된 보너스 포인트 게시판의 버그를 수정한 버전입니다. 해당 버그는 게시글 삭제 시 "글쓰기는 정상적으로 회수가 되나" "댓글에 작성된 보너스 포인트가 회수가 되지 않...
모두 허용은 권하진 않지만 일단 코드는 참고하시고요. 관리자만 허용해서 사용한다면 큰 문제 없을 겁니다. view_comment.skin.php 31~45 주석 참고하세요. ...
깔끔하고 심플한 핀터레스터 갤러리 스킨 입니다. 5.6.8 버전으로 만들었습니다. 기본 갤러리 스킨에서 내부의 ul li 구조에서 div 구조로 변경하고 css 를 조금 수정하였습...
댓글 6개
수고 하셨습니다.
. . .
(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();
?>
유용한 스킨을 공개해주셔서 감사드립니다.
격려의 댓글을 남겨주셔서 감사드립니다.
감사합니다.
감사합니다.^^