Thinreports에서 서식 작성을 보다 간편하게

12524 단어 루비erbThinReports

ruby로 간편하게 서표를 작성할 수 있는 Thinreports



Thinreports를 사용한 서식 작성 단계는 다음과 같습니다.
  • Thinreports-editor로 레이아웃 파일 만들기
  • 루비에서
  • 레이 아웃의 각 항목에 값을 설정
  • generate 메소드로 PDF 출력


  • 이번에는 레이아웃 파일의 정보를 이용하여 각 항목에 대한 설정 로직의 편지지를 작성합니다.

    레이아웃 파일(.tlf)은 JSON



    Thinreports-Editor로 작성된 레이아웃 파일은 JSON이므로,
    정보를 검색해 봅니다.

    레이아웃 파일의 구조(의 분위기)는 다음과 같습니다.
  • items
  • item
  • id
  • type "text-block"

  • item
  • id
  • type "list"
  • items
  • detail
  • items
  • item





  • 이번 주제로 간단한 장표(collection_list.tlf)를 작성했습니다.


    tlf에서 정보를 검색합시다 (1) text-block



    가변 텍스트를 설정하는 것은 type: text-block 이므로, 이 ID를 꺼냅니다.
    require 'json'
    
    @layout="collection_list.tlf"
    
    File.open(@layout) do |j|
        tlf = JSON.load(j)
    
        @text_blocks = []
    
        tlf["items"].each do |item|
            if item["type"] == "text-block"
                @text_blocks.push item["id"]
            end
        end
    
        @text_blocks.each do |i|
            puts i
        end
    end
    

    실행해 보겠습니다.
    PS thinreports> ruby .\extract_text_block.rb
    name
    birthday
    

    우선은 베타인 text-block의 ID를 꺼낼 수 있었습니다.

    tlf에서 정보를 검색합시다 (2) list의 text-block



    그런 다음 목록에서 type: text-block을 검색합니다.
    리스트의 항목은 취급을 바꾸고 싶기 때문에 다른 배열에 격납합니다.
    require 'json'
    @layout="collection_list.tlf"
    
    File.open(@layout) do |j|
        tlf = JSON.load(j)
    
        @text_blocks = []
        @list_text_blocks = []
    
        tlf["items"].each do |item|
    
            if item["type"] == "text-block"
                @text_blocks.push item["id"]
            end
    
            if item["type"] == "list"
                item["detail"]["items"].each do |l_item|
                    if l_item["type"] == "text-block"
                      @list_text_blocks.push l_item["id"]
                    end
                end
            end
    
        end
    
        @text_blocks.each do |i|
            puts i
        end
    
        @list_text_blocks.each do |i|
            puts i
        end
    end
    
    PS thinreports> ruby .\extract_text_block.rb
    name
    birthday
    item_name
    date
    shop
    

    목록의 text-block도 OK입니다.

    erb로 ruby ​​소스 생성



    그럼 소스 생성에 갑시다.
    erb를 만듭니다.

    목록의 text-block은 CSV를 읽고 값을 설정하도록 구성했습니다.
    require 'thinreports'
    require 'csv'
    
    Thinreports::Report.generate filename: 'result.pdf', layout: '<%= @layout %>' do
    
      start_new_page
    
    % @text_blocks.each do |item|
      page.item(:<%= "#{item}" %>).value = ""
    % end
    
      CSV.foreach("data.csv") do |csv_row|
        page.list.add_row do |row|
    %   @list_text_blocks.each_with_index do |l_item,i|
          row.item(:<%= "#{l_item}" %>).value = csv_row[<%= "#{i}" %>]
    %   end
        end
      end
    end
    

    루비에 erb에서 생성 로직 추가
    require 'json'
    require 'erb'
    
    @layout="collection_list.tlf"
    
    # 省略
    
    erb = ERB.new(IO.read("./extract_text_block.erb"), nil, "%" )
    File.open("./src.rb", "w" ) { |f|
      f.write( erb.result(binding) )
    }
    
    

    실행하면 이런 소스가 생성되었습니다.
    require 'thinreports'
    require 'csv'
    
    Thinreports::Report.generate filename: 'result.pdf', layout: 'collection_list.tlf' do
    
      start_new_page
    
      page.item(:name).value = ""
      page.item(:birthday).value = ""
    
      CSV.foreach("data.csv") do |csv_row|
        page.list.add_row do |row|
          row.item(:item_name).value = csv_row[0]
          row.item(:shop).value = csv_row[1]
          row.item(:date).value = csv_row[2]
        end
      end
    end
    
    

    자, PDF 시간입니다.



    데이터가되는 data.csv를 준비하고 (헤더는 필요하지 않습니다)


    아이템
    상점
    날짜


    타이탄
    ○○가게
    197X

    스파이 마술사
    △△가게
    197X

    명령
    □집
    197X


    src.rb를 실행하면 ...!



    일부 설정하지 않은 곳도 있지만, 쉽게 PDF를 만들 수있었습니다.
    코딩뿐만 아니라 문서 작성 등에도 응용할 수 있다고 생각합니다.
    (문서 작성은 표준 장비되어 있습니다)

    템플릿 처리는 재미 있습니다.

    좋은 웹페이지 즐겨찾기