반응형

OuteputStream : 바이트 기반 출력 스트림의 최상위 클래스

<OutputStream을 상속하는 클래스>

  • FileOutputStream
  • PrintStream
  • BufferedOutputStream
  • DataOutputStream

 

1. write(int b) 

한 글자씩 출력 스트림으로 내보냄

 

print로 찍어본 byte값은 이렇게 나온다

파일에 출력된 값은 문자하나하나씩 출력됨

 


2. write(byte[] b)

인자의 모든 바이트를 출력 스트림으로 내보낸다. 

출력 결과

한번에 쭉 출력


3. write(byte[] b, int off, int len)

off부터 lent개의 바이트를 출력 스트림으로 내보냄

출력 결과

[1]과[2] 


flush()

버퍼에 잔류하고 있는 데이터를 모두 출력시키고 버퍼를 비움.

close() 

OutputStream에서 사용했던 시스템 자원을 풀어줌.

반응형
반응형

css 먹히지도 않는 itext5버전으로 열심히 삽질하다가ㅠ ㅠ 

itext7버전으로 광명찾고 성공한 썰. css 다 잘 먹는다 ㅠ ㅠ 흑흑

환경 : VS Code / Spring boot / gradle 사용 

 


1. 필요한 라이브러리 다운로드 

  •  itext7 라이브러리

다운로드 링크

 

Releases · itext/itext7

iText 7 for Java represents the next level of SDKs for developers that want to take advantage of the benefits PDF can bring. Equipped with a better document engine, high and low-level programming c...

github.com

iText7-Core-7.1.14-only-jars.zip 을 받았다.

  •  html2pdf 
 

Maven Repository: com.itextpdf » html2pdf » 3.0.3

pdfHTML is an iText 7 add-on that lets you to parse (X)HTML snippets and the associated CSS and converts them to PDF. com.itextpdf html2pdf 3.0.3 // https://mvnrepository.com/artifact/com.itextpdf/html2pdf implementation group: 'com.itextpdf', name: 'html2

mvnrepository.com

html2pdf-3.0.3.zip 를 받았다.

 

  • (한글 폰트)

한글 텍스트가 포함되어있는 경우 한글 표시를 위해 한글 폰트가 필요하다.

ttf파일은 검색하면 쉽게 구할 수 있음!

사용한 폰트는 맑은고딕임.

 

 


2. 라이브러리 적용(build.gradle)

libs 폴더에 다운받은 jar 파일을 넣고 build.gradle에 명시


3.  A ) html을 String으로 넘기는 경우 

//import 리스트 참고. itext7 은 com.itext.pdf.text나 tool이 아니다.
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.FontProgram;
import com.itextpdf.io.font.FontProgramFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.IBlockElement;
import com.itextpdf.layout.element.IElement;
import com.itextpdf.layout.font.FontProvider;



//BODY : html string , dest : pdf를 만들 경로(D:\\sample.pdf)
public void makepdf(String BODY, String dest) throws IOException {
    //한국어를 표시하기 위해 폰트 적용 
    String FONT = "D:\\malgun.ttf";
    //ConverterProperties : htmlconverter의 property를 지정하는 메소드인듯
    ConverterProperties properties = new ConverterProperties();
    FontProvider fontProvider = new DefaultFontProvider(false, false, false);
    FontProgram fontProgram = FontProgramFactory.createFont(FONT);
    fontProvider.addFont(fontProgram);
    properties.setFontProvider(fontProvider);

    //pdf 페이지 크기를 조정
    List<IElement> elements = HtmlConverter.convertToElements(BODY, properties);
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    //setMargins 매개변수순서 : 상, 우, 하, 좌
    document.setMargins(50, 0, 50, 0);
    for (IElement element : elements) {
      document.add((IBlockElement) element);
    }
    document.close();
}

 


반응형

3.  B) html을 파일로 넘기는 경우

//src : html파일 경로("D:\\sample.html") , dest : pdf를 만들 경로("D:\\sample.pdf")
public void makepdf(String src, String dest) throws IOException {
    //한국어를 표시하기 위해 폰트 적용 
    String FONT = "D:\\malgun.ttf";
    //ConverterProperties : htmlconverter의 property를 지정하는 메소드인듯
    ConverterProperties properties = new ConverterProperties();
    FontProvider fontProvider = new DefaultFontProvider(false, false, false);
    FontProgram fontProgram = FontProgramFactory.createFont(FONT);
    fontProvider.addFont(fontProgram);
    properties.setFontProvider(fontProvider);

    //pdf 페이지 크기를 조정. convertToElements의 매개변수 부분만 다름.
    List<IElement> elements = HtmlConverter.convertToElements(new FileInputStream(src), properties);
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    //setMargins 매개변수순서 : 상, 우, 하, 좌
    document.setMargins(50, 0, 50, 0);
    for (IElement element : elements) {
       document.add((IBlockElement) element);
    }
    document.close();
}

string인 경우랑 거의 똑같음.ㅎㅎ 


아무 옵션 안 주고 ... 텍스트만 덜렁 변환하는 거면 사실

public void createPdf(String html, String dest) throws IOException {
    HtmlConverter.convertToPdf(html, new FileOutputStream(dest));
}

요 소스만으로도  변환이 된다

근데 한국어 표시도 해야되고... 크기도 조절해야 하니까.. ㅎㅎ


변환했던 html 예제

html 소스를 string으로 작성하여 이용함

StringBuilder body = new StringBuilder();
 
String header = "<!DOCTYPE html>" + "<html lang='ko-KR'>" + "<head>" + "<titlet>test</title>"
                + "	<meta charset='UTF-8'/>" + "	<meta name='description' content='Free Web tutorials'/>"
                + "	<meta name='keywords' content='HTML,CSS,XML,JavaScript'/>"
                + "	<meta name='viewport' content='width=device-width, initial-scale=1.0'/>"
                + "	<meta http-equiv='X-UA-Compatible' content='IE=Edge'/>"
                + "<script src='https://use.fontawesome.com/releases/v5.2.0/js/all.js'></script>" + "</head>";
                
String middle = "<body style='margin:auto; padding: 0;'>"
                + "	<div class='logo' style='width: 780px;height: 40px;padding: 10px; margin: auto;'>"
                + "		<a href='#' style='color: #000000;text-decoration: none;'><img src='img/logo.png' alt='로고'/></a>"
                + "	</div>";

String footer = "	<div class='footer' style='width: 780px;height: 60px;padding: 20px;text-align: center;font-size: 0.75em; margin: auto;'>"
                + "	본 메일은 발신전용 입니다. 자세한 사항은 홈페이지를 확인해 주시기 바랍니다.	" + "	</div>" + "</body>" + "</html>";
                
body.append(header);
body.append(middle);
body.append(footer);

String BODY = body.toString();

// html to pdf
makepdf(BODY, today);

 


 

 

참고한 페이지

 

  • itext7 기본 사용법 참고
 

Chapter 1: Hello HTML to PDF

 

kb.itextpdf.com

  • margin 세팅 관련
 

iText 7 can not set margin

I have an HTML string, i need to convert it to pdf, but pdf that i need must have specific size and margin. I did as the example show, now i have pdf with width and height that i set, BUT i can`t c...

stackoverflow.com

  • itext 구버전으로 구현한 소스 참고
 

iText 로 html에서 pdf 만들기

코드를 약간 수정 하였습니다.다음의 궁금한 점에 대해서 자 답을 하지 못했습니다.복잡한 css 파일의 경우...

blog.naver.com

 

반응형
반응형

VSCode에서 Tomcat for JAVA 플러그인 설치하고 실행하려고 하니까 

[apache-tomcat-9.0.37]: 'C:\Program' is not recognized as an internal or external command,
operable program or batch file.

에러가 자꾸 뜨는거..

심지어 한글은 자꾸 깨져서 짜증..

settings.json 파일에

"java.home""C:/Program Files/Java/jdk1.8.0_281"  경로를

"java.home""C:/Java/jdk1.8.0_281" 로 바꿔주거나

그 라인을 주석처리하면 된다...

띄어쓰기 때문에 Program만 쳐 인식 했나봄 짜증

 

 

반응형
반응형

InputStream : 바이트 기반 입력 스트림의 최상위 클래스<InputStream을 상속받는 클래스>

  • FileInputStream
  • BufferedInputStream
  • DataInputStream

테스트파일 text.txt 내용 

a1b2c3


1. read() 메소드 

InputStream.read()

1바이트씩 읽고 int 타입으로 리턴한다.

이게 무슨말인가 봤더니 아스키코드로 반환하는 거였음

읽을 게 없으면 -1을 반환함


2. read(byte[] b) 메소드

InputStream.read(byte[])

byte배열 타입을 매개값으로 받아서 배열 길이만큼 바이트를 읽고 배열에 저장한다.

읽은 바이트 수를 리턴함

읽을 게 없으면 -1을 반환함


3. read(byte[], int off, int len) 메소드 

InputStream.(byte[] , int , int ) 

입력스트림으로부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트배열 byte[off]부터 len개를 저장한다.

읽은 바이트 수를 리턴함

 

읽을 게 없으면 -1을 반환함

재밌네

반응형
반응형

1. 일시정지(sleep)

주어진 시간 동안 일시 정지 상태(TIMED_WAITING)가 되고, 다시 실행 대기 상태(RUNNABLE)로 돌아간다.

일시정지 상태에서 주어진 시간이 되기 전에 interrupt() 메소드가 호출되면 InterruptedException이 발생 -> catch에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다. 


2. 실행 양보(yield)

실행 대기 상태로 돌아가고, 동일한 우선순위 또는 높은 우선순위를 갖는 다른 스레드가 실행 기회를 가질 수 있게 한다.


2. 다른 스레드의 종료를 기다림(join)

다른 스레드가 종료될 때까지 기다렸다가 실행함


3. wait(), notify(), notifyAll()

  • notify() : 공유객체가 한 스레드가 작업을 완료하면 notify()메소드를 호출해서 일시정지 상태에 있는 한 개의 스레드를 실행대기 상태로 만든다.
  • wait() :  다른 스레드를 실행대기 상태로 만들고 자신은 wait()로 일시정지 상태로 만든다. 
  • notifyAll() : wati()에 의해 이시 정지된 모든 스레드들을 실행 대기 상태로 만든다.
  • 이 메소드들은 동기화 메소드 또는 동기화 블록 내에서만 사용할 수 있다.
  • notify와 wait를 사용할 때 synchronized 를 사용하지 않으면 java.lang.IllegalMonitorStateException이 발생함.

두 개의 스레드가 이용하는 공유 객체.. 일종의 DTO라고 생각하면 될 듯..

Getter -> 데이터가 없으면 wait하고 데이터가 set 되길 기다림 / 데이터가 있으면 반환하고 null로 만듦

Setter -> 데이터가 없으면 data를 set하고 데이터가 있으면 wait하고 get하길 기다림

Data를 Set하는 Thread
Data를 Get하는 Thread
두 스레드를 이용하는 메인 스레드 

 

반응형
반응형
  • 임계영역 : 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역


임계영역 지정 방법

1. 동기화 메소드

메소드에 synchronized 붙이기

2. 동기화 블록

일부 내용만 임계영역으로 만들고 싶은 경우

반응형
반응형

멀티 프로세스 : 애플리케이션 단위의 멀티 태스킹

멀티 스레드 : 애플리케이션 내부에서의 멀티 태스킹

  • 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드의 영향을 미침.
  • 메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 계속 실행 중이라면 프로세스는 종료되지 않음.

 


스레드 만들기

1. Thread 클래스로부터 직접 생성

java.lang.Thread 클래스로부터 작업 스레드 객체를 직접 생성.

Runnable 인터페이스를 구현한 작업 스레드 클래스
main 스레드

(Runnable 익명 객체를 사용하는 경우)


 

2. Thread 하위 클래스로부터 생성

Thread 클래스를 상속한 후 run메소드를 재정의 

Thread를 상속받은 작업 스레드 클래스
main 스레드

(Thread 익명 객체를 사용하는 경우)

반응형
반응형

 

베스트 셀러라 봤음.
청소년문학에 어울리는 이야기이다.
국가에 의해 관리되는 아이들을 키우는 센터.
그 센터에서 자라는 아이들은 부모가 되기 위해 찾아오는 사람들의 면접을 실행함
parent+interview= paint
부모가 된다는 것,
가족으로 산다는 건 어떤건지 되돌아본다.
심신이 지칠 때 가볍게 읽을만한 책.





"아이는 부모의 필요에 의해 태어난 존재들 같아요"




"대부분 예행연습없이 부모가 되잖아요"





모든 어른의 가슴속에는 자라지 못한 아이가 살고 있다고 했다. 여자의 가슴속에 발레를 끔직하게 싫어하는 열 살 아이가 살고 있는 것처럼.






어쩌면 지금도 많은 아이들이, 자신의 꿈이 아닌 부모 꿈의 대리인으로 살아가는지도 몰랐다. 아니, 자신이 대리인이라는 것조차 모르고 있을 수도...






"내가 엄마에게서 정신적으로나 경제적으로 독립이 필요했듯이 엄마 역시 나로부터 독립이 필요했다는 걸 말이야"



반응형
반응형

조건1) 초기화면에도 Datatable 형식의 table이 있어야함

조건2) 날짜 조건으로 검색(AJAX로 비동기처리)하면 데이터를 DataTable에 뿌려야 함

조건3) 데이터 뿌리고 ordering, filtering, paging이 다 먹어야함

(each를 이용하여 table에 text로 뿌리는 경우 기능이 안 먹었음.. 비동기로 가져와서 그런지 클릭하면 데이터가 없어짐)

 

 


1. 기본 화면 Datatable 구현 소스

language 는 그냥 한국어 표시용 옵션임.

 

2. 검색 시 Datatable 구현 소스

DataTable().destroy()를 넣은 이유는 위의 소스에서 생성된 datatable 때문에 

검색시 기존걸 없애고 다시 생성하기 위함. 

안 넣으면 아래처럼 cannot reinitialise datatable 오류가 뜸 

 

3. Controller 소스 

return 데이터 타입 : Map<String,Object>

Object 타입으로 반환해야 한다고 봤는데 Map도 된당. 

이름은 data로...

반환받은 데이터

~결과~  ~성공~

아래 글을 참고하였음~

 

데이터테이블즈(datatables) 메뉴얼 정리 v2.0

이 글은 datatables 1.10.19 기반으로 작성되었습니다 안녕하세요 해피용입니다 이번 시간에는 datatables ...

blog.naver.com

 

 

Jquery DataTable ajax data 이용하기

jquery / jquery ui / table css / datatable / DataTables HTML 에 tbody를 c:forEach 등을 이용해...

blog.naver.com

 

반응형
반응형

데이터는 다음과 같다. CSV로 저장하였음

데이터1 ) ID와 데이터가 있는 data.CSV
데이터2 ) ID와 NAME이 있는 model.CSV 


 

1. 파일 읽어들이기

###### 첫 번째 파일 읽기 ######
setwd("C:/Users/USER/Desktop")
tsv <-fread("data.csv")

 

 

###### 두 번째 파일 읽기 ######
setwd("C:/Users/USER/Desktop")
NAME <-fread("model.csv")

 

 

 

2. 두 데이터 합치기 merge

MergeTsv <- merge(tsv,NAME,by="ID",all=FALSE)

 

all 옵션 : 

all=TRUE 일때는 합집합(좌)

all=FALSE 일때는 교집합(우)

 

 

3. 데이터 타입 변환

MergeTsv$DATA <- as.numeric(MergeTsv$DATA)

############### POSIX 타입으로 변환하는 경우####################
MergeTsv$REG_DATE <- as.POSIXct(MergeTsv$REG_DATE,format="%H:%M:%S")

############### %H:%M 처럼 변환 형태를 지정하는 경우 format 이용####################
############### format을 이용하면 CHAR 타입으로 변환이 된다....####################
MergeTsv$REG_DATE<-format(as.POSIXct(MergeTsv$REG_DATE,format = "%H:%M:%S"),"%H:%M")

 

4. ggplot 이용하여 꺾은선 그래프 그리기

//x=축 데이터, y=y축 데이터, colour, group = 구분 기준
ggplot(MergeTsv,aes(x=REG_DATE,y=DATA, colour=DAY,group=DAY))+
//facet_wrap=plot이 만들어지는 단위 기준
 geom_line()+facet_wrap(~NAME,ncol = 1, scales="free")+
 coord_cartesian(ylim=c(1,150))+
 scale_x_discrete(breaks= c("03:00","06:00","09:00","12:00","15:00","18:00","21:00"))

- group :  한 장비의 yesterday, today 별로 그래프를 그리고 싶어서 group을 주었음

- facet_wrap : 장비 NAME 별로 그래프를 따로 그리기 위해 facet_wrap 사용

- ncol : 열의 갯수 

- scales :  x 축 라벨이 각  행마다 다 들어가려면 free

- coord_cartesian : y축 범위 설정

- scale_x_discrete : x축 라벨 표시 간격 설정

 


ncol = 1 옵션 넣은 것 

ncol = 1 옵션 안 넣은 것 


scales = "free" 넣은것 

scales = "free" 안 넣은것 


scale_x_discrete 사용 안 한 것

미친자처럼 x축 라벨이 다 달리는 바람에 겹쳐서 선이 되어버림 ㄹㅇ 멸망

scale_x_discrete 사용 한 것

으음~깰끔~

 


5. 파일로 저장하기

###### pdf 열기 ######
pdf("example.pdf")
###### 그래프 그리기 ######
ggplot(MergeTsv,aes(x=REG_DATE,y=DATA, colour=DAY,group=DAY))+geom_line()+facet_wrap(~NAME,ncol = 1)
###### 닫기 ######
dev.off()

이렇게 하면 pdf로 저장됨

혹은

ggsave(file=pdfname,plot=all_plot,height=5, units="in", limitsize = FALSE)

 

 

 


그래프 그리기 연습하면서 참고한 블로그 

*  merge 내용 참고

 

R - 기본함수 - rbind / cbind / merge

R에서 데이터를 결합하는 함수로는 rbind, cbind, merge 세가지가 있습니다. 1. rbind데이터프레인 df1과 ...

blog.naver.com

 

* facet_wrap과 ncol 참고

 

R ggplot2 집단간 비교를 위한 면 분할(facet, Trellis) : facet_grid(), facet_wrap()

그룹(집단, 요인) 간의 데이터 분포 형태, 변화 추이 등을 비교 분석하기에 유용한 방법으로 비교하려는 축을 기준으로 면을 분할하여 그래프를 그룹 간 비교하는 방법이 있습니다. Lattice 패키지

rfriend.tistory.com

* x축 표시 참고

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

* 아래 오류 참고

geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?

 

ggplot2 tips – 숨은원리 데이터사이언스: R로 하는 데이터 사이언스

 

ds.sumeun.org

 

반응형

+ Recent posts