티스토리 뷰

지금까지 무료 오픈 소스 패키지인 OpenBiblio를 효율적인 도서 및 문서 관리에 어떻게 활용할 수 있을지에 대하여  다양한 기능 개발을 통해 살펴보았다. 이번 포스팅에서는 마지막으로 OpenBiblio에 등록해둔 목록 정보를 MARC 레코드 형태로 내보내는 기능을 만들어 보고자 한다.
  
MARC Export 기능은 미국 의회 도서관의 검색 기능 처럼 검색 이후 내보내기할 목록을 체크하여 내보내기 할 수도 있지만,
OpenBiblio 사용 경험을 준용하는 차원에서 보고서 검색 조건을 입력하는 화면에 기존 출력 형태인 HTML(페이징), HTML(전체), CSV와 함께 MARC21 형태를 선택하여 MARC21을 선택하면 검색 조건에 따른 결과를 MARC 파일로 내보내도록 개발한다.(KORMARC도 MARC21 스펙을 따른다)


 

MARC 레코드 정의에 대해서는 이전 포스팅(Z39.50 서버 만들기 - 오픈소스 YAZ와 OpenBiblio 기반)에서 다루었으므로 국립 중앙 도서관이나,  미의회도서관에서 배포하는 자료를 참조하기 바란다.
  
OpenBiblio용 Z39.50  서버 제작의 경우에는 MARC 레코드 제작을 코드에서 직접 일일이 조립했으나, MARC export는 또다른 오픈소스 도서관 프로젝트 인 Emilda 에서 제공하는 php 라이브러리가 있어 해당 라이브러리를 활용하여 좀더 편리하게 MARC 레코드 Export 기능을 제작해 볼까 한다.
  
php-marc 라는 프로젝트로 http://www.emilda.org/index.php?q=php-marc에서 다운로드 받을 수 있다.
프로젝트를 다운로드 받아 파일 중에 php-marc.php 파일을 classes 폴더에 복사하면 MARC Export를 위한 개발 환경 준비는 끝난 것이다.
 
reports 디렉토리 아래에 있는 report_criteria.php 코드에 아래와 같이 MARC21 Export를 위한 선택을 추가해준다.




동일 폴더에 있는 run_report.php에 MARC21 출력 형태를 위한 코드를 아래와 같이 삽입한다.

 

  if ($format == 'csv') {
    include_once('../classes/CsvTable.php');
    $table = new CsvTable;
    header('Content-type: text/csv;header=yes');
    header('Content-disposition: inline; filename="'.$rpt->type().'.csv"');
    $rpt->table($table);
    exit;
  }  else if ($format == 'marc') {
    include_once('../classes/Marc21.php');
    $table = new Marc21;
    header('Content-type: application/octet-stream;header=yes');
    header('Content-disposition: inline; filename="'.$rpt->type().'.mrc"');
    $rpt->table($table);
    exit;
  }


위의 코드에서도 확인 수 있지만 MARC21로 출력 지시가 오면 classes폴더에 있는 Marc21.php를 수행하도록 되어 있다.
Marc21.php는 출력을 CSV 파일로 내보내는 CsvTable.php을 변형하여 CSV 파일 대신 MARC 레코드를 출력하는 코드를 삽입한다.
  
Marc21 클래스 파일을 보면 parameters, columns, start, row, end함수에 적절한 코드를 추가하면 되는데, 각 검색 행 별로 row() 함수가 호출되므로 row() 함수에 검색행에 있는 목록 키(bibid)를 기준으로 목록 테이블과 추가 MARC 필드 테이블을 읽어 MARC 레코드를 제작하여 내보내는 코드를 삽입한다. 다음은 Marc21 클래스 파일의 일부이다.
  

  function row($row) {
    $qry = new Query();
    $sql = "SELECT bibid, date_format(last_change_dt, '%Y%m%d%k%i%s') as last_change_dt, ".
      "date_format(create_dt, '%Y%m%d%k%i%s') as create_dt, `title`, title_remainder, ".
      "author, topic1, topic2, topic3, topic4, topic5 FROM `biblio` WHERE bibid=".$row[bibid];
    if ($qry->_query($sql, "")) {
      if (($fldrow= $qry->_conn->fetchRow()) !== false) {
        $record = new Record;
        /* 001  제어번호(Control Number) */
        $field = new Field("001", "OB".substr("0000000000".$fldrow[bibid],-10));
        $record->append_fields($field);
        /* 005  최종처리일시 (Date and Time of Latest Transaction) */
        $field = new Field("005", $fldrow[last_change_dt]);
        $record->append_fields($field);
        /* 008 - 부호화 정보필드(40자리) */  
        $field = new Field("008", substr($fldrow[create_dt],2,6)."s".substr($fldrow[create_dt],0,4)."    ulk"."a                "."kor  ");
        $record->append_fields($field);
        
        /* 245a - title */
        $field = new Field("245", "0", "0", array("a" => trim($fldrow[title])));
        /* 245b - title_remainder */
        $tmp = trim($fldrow[title_remainder]);
        if (!empty($tmp)) $field->add_subfields(array("b" => $tmp));
        /* 245 추가 확장 MARC */
        $tmp = $this->get_dbfld("245", $fldrow[bibid]);
        if (!empty($tmp)) $field->add_subfields($tmp);
        $record->append_fields($field);
........


  
  
MARC 레코드 형태로 내려받기한 파일은 확장자 *.mrc로 저장한다. 그런데 MARC 레코드는 내용중에 있는 제어문자 때문에 텍스트 편집기 등으로는 정확한 내용 확인이 어렵다. 아래 그림은 내보내기한 acquisitions.mrc 파일을 HexEditer로 살펴본 것이다. 1e, 1f, 1d등의 제어 문자가 있고 개행 문자가 없는등 텍스트 파일 편집기로 여는것 자체가 적절치 않다.




  
MARC 파일을 확인해 볼 수 있는 한가지 방법은 OpenBiblio의 목록 관리>목록 일괄 입력에서 해당 파일을 입력해 보는 것이다.
아래 그림은 검사 모드로(실제로는 등록하지 않고 먼저 Marc 파일을 확인하는 방법. 입력 검사 여부에 "예" 선택) 내보내기 한 파일을 확인해 본 결과이다.




(주)동운시스템 전화 041-358-3760

동운북스 소개 바로가기
[온라인 문의 및 견적요청]

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함