PrimeReact + Formik

PrimeReact에서 Formik 으로 Form 개발하는 법 정리. 

import React, {useEffect, useState, useContext, useRef} from 'react';
import { Dialog } from 'primereact/dialog';
import { Button } from 'primereact/button';
import { InputText } from 'primereact/inputtext';
import { useFormik } from 'formik';
import { classNames } from 'primereact/utils';
export function FormDemo(props) {
const [editMode, setEditMode] = useState(true); // 한 Dialog를 공유하기 위해, true이면 편집모드, false이면 Add New Mode
const [showNew, setShowNew] = useState(false);
const [initialData, setInitialData] = useState({
sid: null,
name: "",
address: "",
description: "",
owner: ""
});
const formik = useFormik({
initialValues: initialData,
enableReinitialize: true,
validate: (data) => {
let errors = {};
if (!data.name) {
errors.name = "이름을 입력하세요";
}
if (!data.address) {
errors.address = "주소를 입력하세요";
}
return errors;
},
onSubmit: (data) => {
console.log("formik onSubmit");
console.dir(data);
/* Do the real thing here */
/*
if (editMode === true) {
onUpdateSite();
} else {
onCreateSite();
}
*/
}
});
const isFormFieldInvalid = (name) => !!(formik.touched[name] && formik.errors[name]); // !! 는 truethy, falsey 값을 true, false로 정규화함.
const getFormErrorMessage = (name) => {
return isFormFieldInvalid(name) ? <small className="p-error">{formik.errors[name]}</small> : <small className="p-error">&nbsp;</small>;
}
const renderDialogFooter = () => {
return (
<div>
<Button label="Cancel" icon="pi pi-times" onClick={() => setShowNew(false)} className="p-button-text" />
<Button label={editMode===true ? "수정하기" : "만들기"} icon="pi pi-check" onClick={formik.handleSubmit} type="button" autoFocus />
</div>
);
}
return (
<div>
<Dialog header={editMode ? `사이트 수정: ID=${sid}` : "새 사이트 등록"} visible={showNew} style={{ width: '500px' }} footer={renderDialogFooter} onHide={() => setShowNew(false)}>
<form onSubmit={formik.handleSubmit} onReset={formik.handleReset}>
<div className="grid mt-4">
<div className="col-12">
<span className="p-float-label">
<InputText id="name" value={formik.values.name} onChange={(e) => formik.setFieldValue('name', e.target.value)}
className={classNames('width-100', {'p-invalid': isFormFieldInvalid('name')})} size={60}/>
<label htmlFor="name">사이트 이름</label>
</span>
{getFormErrorMessage('name')}
</div>
<div className="col-12">
<span className="p-float-label">
<InputText id="owner" value={formik.values.owner} onChange={(e) => formik.setFieldValue('owner', e.target.value)}
className={classNames("width-100", {"p-invalid": isFormFieldInvalid('owner')})} size={60}/>
<label htmlFor="owner">소유자 ID</label>
</span>
{getFormErrorMessage('owner')}
</div>
<div className="col-12">
<span className="p-float-label">
<InputText id="address" value={formik.values.address} onChange={(e) => formik.setFieldValue('address', e.target.value)}
className={classNames("width-100", {'p-invalid': isFormFieldInvalid('address')})} size={60}/>
<label htmlFor="address">사이트 주소</label>
</span>
{getFormErrorMessage('address')}
</div>
<div className="col-12">
<span className="p-float-label">
<InputText id="description" value={formik.values.description} onChange={(e) => formik.setFieldValue('description', e.target.value)}
className={classNames("width-100", {'p-invalid': isFormFieldInvalid('description')})} size={60}/>
<label htmlFor="description">사이트 설명</label>
</span>
{getFormErrorMessage('description')}
</div>
</div>
</form>
</Dialog>
</div>
);
}
view raw form.js hosted with ❤ by GitHub

이미지를 PDF로 만들기 & PDF 합치기 등

1. Image를 pdf로 변환하기 
- 온라인에서 image를 pdf로 변환하는 툴은 많으나, 사용하지 말길 권한다. 중요한 정보가 인터넷에 누출될 가능성이 있다.
- 예전에는 ImageMagick 으로 이미지를 pdf로 변환할 수 있었으나, 이제 더 편리한 도구가 나왔다. 
- Python에서 동작 가능한 img2pdf 가 그것이다. 
- 설치 (Python이 설치되어 있다고 가정하면)

$ pip install img2pdf 

- 실행

$ img2pdf 1.jpg 2.jpg 3.jpg --pagesize A4 -o out.pdf 

2. PDF 병합/분할/회전하기
- pdfsam 이라는 툴을 사용하면 된다. 무료버전도 있으므로 유용하다. 
- 다운로드: https://pdfsam.org/ko/ 

인기글