tcpdf로 게시글을 pdf로 다운로드하기 > 그누보드5 스킨

그누보드5 스킨

좋은 댓글과 좋아요는 제작자에게 큰힘이 됩니다.

tcpdf로 게시글을 pdf로 다운로드하기 정보

게시판 tcpdf로 게시글을 pdf로 다운로드하기

첨부파일

pdf_dowonload.zip (19.9M) 7회 다운로드 2025-01-30 15:58:54 포인트 차감10
테스트한 버전5.6
호환 가능 버전버전에 큰 영향을 받지 않을 듯 합니다

본문

2106540763_1738220283.1655.png

 

그누보드 게시판의 게시글을 tcpdf를 사용해서 pdf파일로 다운로드 하는 스킨입니다.

tcpdf홈페이지(TCPDF)에서 tcpdf를 다운로드해서 서버의 적당한 위치에 업로드합니다.

tcpdf 파일용량이 55mb정도라서 그누보드 파일첨부로 업로드가 되지않습니다.

 

tcpdf2106540763_1738217187.3314.png

 

tcpdf는 한글이 작동되지 않기때문에 

위의 tcpdf의 fonts폴더안에 fonts폴더의 나눔고딕폰트를 업로드해줍니다.

2106540763_1738217420.0011.png

 

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

댓글 전체

감사합니다. 
상수로 정의하는 것이 어떤지 챗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();
?>
 

전체 2,693 |RSS
그누보드5 스킨 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT