검색결과 리스트
[정보] IT정보&활용에 해당되는 글 97건
- 2025.06.02 PDF에 비밀번호 설정하기2
- 2025.04.23 [한컴한글] 제목 셀을 세로로...
- 2025.01.10 구글 스프레드 시트에서 날짜와 시간을 계산하는 방법
- 2024.11.29 엑셀로 IPA 분석하기, VBA 활용 1
- 2024.11.06 PDF 나누기(split) 2
글
PDF에 비밀번호 설정하기2
2025.05.28 - [[楞嚴] 생각 나누기/[情] 사회복지정보화] - PDF에 비밀번호 설정하기
PDF에 비밀번호 설정하기
급한 분을 위해 파일을 먼저 올려두었습니다.하지만 아래도 한번 읽어봐주세요. 개인정보보호법 등이 강화되면서 PDF 파일을 보내려할 때에도 비밀번호를 설정해야하는 경우가 있습니다.하지만
welfareact.net
앞서 CMD 창에서 직접 입력해야하는 PDF 비밀번호 설정 프로그램을 공유했지만, 아무래도 이런 직접적인 명령에 익숙치 않은 분들도 많을거 같아 추가로 작업해보았습니다.
먼저번 것은 파일 하나만으로 가능토록 통합한 것이었다면, 이번엔 PDF 파일을 선택하고, 비밀번호를 입력하는 창이 떠서 보다 직관적으로 작업할 수 있도록 수정했습니다.
다만, 이번엔 파일 하나로 안되어서 압축 자동실행 파일로 만들었습니다.
위 파일을 다운로드 받으신 다음, 실행하면 프로그램 폴더가 만들어집니다.
이후 파일 중 bat 파일 [ PDF_비밀번호_v2.bat ]을 더블클릭하시면 됩니다.
아래는 몰라도 되는 이야기입니다.
위와 같이 만들기 위해 PowerShell GUI 스크립트를 먼저 만들었습니다.
바로 [ EncryptPdf-GUI.ps1 ] 파일입니다.
Add-Type -AssemblyName Systehttp://m.Windows.Forms Add-Type -AssemblyName System.Drawing # 폼 생성 $form = New-Object Systehttp://m.Windows.Forms.Form $form.Text = "PDF 비밀번호 설정 도구 (use QPDF)" $form.Size = New-Object Systehttp://m.Drawing.Size(400, 360) $form.StartPosition = "CenterScreen" # 파일 선택 라벨 $fileLabel = New-Object Systehttp://m.Windows.Forms.Label $fileLabel.Text = "PDF 파일: 아직 선택되지 않음" $fileLabel.Location = New-Object Systehttp://m.Drawing.Point(10, 20) $fileLabel.Size = New-Object Systehttp://m.Drawing.Size(360, 20) $forhttp://m.Controls.Add($fileLabel) # 파일 선택 버튼 $fileButton = New-Object Systehttp://m.Windows.Forms.Button $fileButton.Text = "PDF 파일 선택" $fileButton.Location = New-Object Systehttp://m.Drawing.Point(10, 50) $fileButton.Size = New-Object Systehttp://m.Drawing.Size(120, 30) $forhttp://m.Controls.Add($fileButton) # 비밀번호 입력 라벨 $pwdLabel = New-Object Systehttp://m.Windows.Forms.Label $pwdLabel.Text = "설정할 비밀번호:" $pwdLabel.Location = New-Object Systehttp://m.Drawing.Point(10, 100) $pwdLabel.Size = New-Object Systehttp://m.Drawing.Size(200, 20) $forhttp://m.Controls.Add($pwdLabel) # 비밀번호 입력 박스 $pwdBox = New-Object Systehttp://m.Windows.Forms.TextBox $pwdBox.Location = New-Object Systehttp://m.Drawing.Point(10, 125) $pwdBox.Size = New-Object Systehttp://m.Drawing.Size(360, 25) $pwdBox.UseSystemPasswordChar = $true $forhttp://m.Controls.Add($pwdBox) # 암호화 버튼 $encryptButton = New-Object Systehttp://m.Windows.Forms.Button $encryptButton.Text = "PDF 암호화 실행" $encryptButton.Location = New-Object Systehttp://m.Drawing.Point(10, 160) $encryptButton.Size = New-Object Systehttp://m.Drawing.Size(120, 30) $forhttp://m.Controls.Add($encryptButton) # 상태 표시 라벨 $statusLabel = New-Object Systehttp://m.Windows.Forms.Label $statusLabel.Text = "" $statusLabel.Location = New-Object Systehttp://m.Drawing.Point(10, 200) $statusLabel.Size = New-Object Systehttp://m.Drawing.Size(360, 40) $forhttp://m.Controls.Add($statusLabel) # 저작권 라벨 $copyrightLabel = New-Object Systehttp://m.Windows.Forms.Label $copyrightLabel.Text = "This software includes QPDF, licensed under Apache License 2.0.`nSee https://github.com/qpdf/qpdf" $copyrightLabel.Location = New-Object Systehttp://m.Drawing.Point(10, 250) $copyrightLabel.Size = New-Object Systehttp://m.Drawing.Size(380, 50) $copyrightLabel.Font = New-Object Systehttp://m.Drawing.Font("Arial", 8) $forhttp://m.Controls.Add($copyrightLabel) # 전역 변수로 파일 경로 보관 $global:selectedPdfPath = $null # 파일 선택 버튼 이벤트 $fileButton.Add_Click({ $fileDialog = New-Object Systehttp://m.Windows.Forms.OpenFileDialog $fileDialog.Filter = "PDF Files (*.pdf)|*.pdf" if ($fileDialog.ShowDialog() -eq "OK") { $global:selectedPdfPath = $fileDialog.FileName $fileLabel.Text = "PDF 파일: " + [Systehttp://m.IO.Path]::GetFileName($selectedPdfPath) } }) # 암호화 버튼 이벤트 $encryptButton.Add_Click({ if (-not $selectedPdfPath) { [Systehttp://m.Windows.Forms.MessageBox]::Show("먼저 PDF 파일을 선택하세요.", "오류", "OK", "Error") return } $password = $pwdBox.Text if (-not $password) { [Systehttp://m.Windows.Forms.MessageBox]::Show("비밀번호를 입력하세요.", "오류", "OK", "Error") return } $outputPath = Join-Path -Path ([Systehttp://m.IO.Path]::GetDirectoryName($selectedPdfPath)) -ChildPath ("encrypted_" + [Systehttp://m.IO.Path]::GetFileName($selectedPdfPath)) try { Start-Process -FilePath "qpdf.exe" -ArgumentList "--encrypt `"$password`" `"$password`" 256 -- `"$selectedPdfPath`" `"$outputPath`"" -NoNewWindow -Wait $statusLabel.Text = "★ 암호화 완료! 파일: encrypted_" + [Systehttp://m.IO.Path]::GetFileName($selectedPdfPath) } catch { $statusLabel.Text = "☆ 암호화 실패: $_" } }) # 폼 실행 $form.Topmost = $true $form.Add_Shown({ $form.Activate() }) [void]$form.ShowDialog() |
이후 이 파일을 .bat에서 불러오게 했습니다.
@echo off title PDF 비밀번호 설정 도구 실행기 (QPDF) echo ======================================== echo PowerShell GUI를 실행합니다... echo ======================================== echo. powershell -ExecutionPolicy Bypass -File "%~dp0EncryptPdf-GUI.ps1" echo. |
'[정보] IT정보&활용' 카테고리의 다른 글
[한컴한글] 제목 셀을 세로로... (0) | 2025.04.23 |
---|---|
구글 스프레드 시트에서 날짜와 시간을 계산하는 방법 (0) | 2025.01.10 |
엑셀로 IPA 분석하기, VBA 활용 (1) | 2024.11.29 |
PDF 나누기(split) (2) | 2024.11.06 |
PDF 파일 합치기(수정) (1) | 2024.11.01 |
설정
트랙백
댓글
글
[한컴한글] 제목 셀을 세로로...
한컴한글로 문서를 작성하다보면 서식을 표로 만드는 경우가 많다.
이때 제목 셀을 세로로 만들어 반복하고 싶은 경우는 없었는가?
결론부터 말해, 아직까지 한컴한글에서 이러한 방식을 공식적으로 지원하지는 않는다.
다만 약간의 편법을 사용하면, 마치 제목셀이 반복되는 것처럼 보이게 만들 수는 있다.
바로 “머리말”을 활용하는 방법이다.
1. 반복될 세로로 긴 셀을 본문에서 편집해 작업한 다음, 머리말로 만들어 넣는다. 이때 선 모양은 없음으로 한다. 2. 이제 본문에서 보여질 표를 만들어 작업한다. 이때 제일 왼쪽에 제목셀이 될 부분의 선 모양 등을 여기서 설정한다. 단 내용은 빈칸으로 한다. |
이렇게 하면 머릿글에는 내용이, 본문에는 서식이 있는 형태가 된다. 이는 마치 두 레이어를 겹쳐놓은 것과 같은 효과를 보이는데, 이를 통해 제목셀을 적용한 것처럼 보이는 결과물을 얻을 수 있다.
※ 덧붙여 한컴한글은 파워포인트 등과 달리 폰트를 포함해서 저장하는 기능이 없다.
만일 제목셀처럼 단순 반복되는 경우라면 해당 내용을 이미지로 만들어 저장하는 것이 하나의 대안이 될 수 있다.
만일 편집이 따로 필요없다면, PDF로 만들어 배포할 수도 있을 것이다.
'[정보] IT정보&활용' 카테고리의 다른 글
PDF에 비밀번호 설정하기2 (0) | 2025.06.02 |
---|---|
구글 스프레드 시트에서 날짜와 시간을 계산하는 방법 (0) | 2025.01.10 |
엑셀로 IPA 분석하기, VBA 활용 (1) | 2024.11.29 |
PDF 나누기(split) (2) | 2024.11.06 |
PDF 파일 합치기(수정) (1) | 2024.11.01 |
설정
트랙백
댓글
글
구글 스프레드 시트에서 날짜와 시간을 계산하는 방법
1. 일반적인 경우 날짜와 시간의 연산
날짜와 시간의 연산은 상식의 범위 내에서 계산됩니다. 예를 들어, 2025. 1. 2에서 2025. 1. 1을 빼면 1이 나옵니다.
시간 연산도 마찬가지로, 8:00에서 3:00을 더하면 11:00이 나옵니다.
2. 날짜와 시간이 함께 있는 경우
2025. 1. 2 오후 6:00에서 2025. 1. 1 오전 9:00을 빼면 1.375가 나옵니다.
서식을 수정하면 33:00으로 표시될 수 있습니다. 이는 33시간의 차이를 의미합니다.
3. 1.375의 의미
2025. 1. 1은 숫자 45,658에 해당합니다. 이는 1900. 1. 1을 기준으로 45,658번째 날임을 의미합니다.
오전 9:00은 9/24, 즉 0.375로 표현됩니다. 따라서 2025. 1. 1 오전 9:00은 45658.375가 됩니다.
같은 방식으로 2025. 1. 2 오후 6:00은 45659.75가 됩니다.
이 둘을 빼면 1.375가 됩니다.
4. 근무 시간 계산
일반적으로 1일 8시간을 근무합니다. 따라서 1시간은 1/8, 즉 0.125로 계산됩니다.
8시간을 1일로 계산하려면 날짜와 시간을 따로 추출하여 계산해야 합니다.
5. INT와 MOD 함수 활용
INT 함수는 소수점 이하를 버리고 정수 부분만 반환합니다. 예를 들어, =INT(B1)은 날짜값만 반환합니다.
MOD 함수는 나머지를 구하는 함수입니다. 예를 들어, =MOD(B1, 1)은 시간값만 반환합니다.
날짜와 시간을 따로 추출하여 연산할 수 있습니다. 예를 들어, =INT(B1)-INT(C1)과 =MOD(B1, 1)-MOD(C1, 1)을 사용합니다.
6. 8시간을 1일로 계산
INT로 구한 날짜값은 그대로 두고, MOD로 구한 시간값을 다시 INT로 몫을 구해 날짜에 더해줍니다.
MOD로 구한 나머지는 시간으로 나타냅니다.
'[정보] IT정보&활용' 카테고리의 다른 글
PDF에 비밀번호 설정하기2 (0) | 2025.06.02 |
---|---|
[한컴한글] 제목 셀을 세로로... (0) | 2025.04.23 |
엑셀로 IPA 분석하기, VBA 활용 (1) | 2024.11.29 |
PDF 나누기(split) (2) | 2024.11.06 |
PDF 파일 합치기(수정) (1) | 2024.11.01 |
설정
트랙백
댓글
글
엑셀로 IPA 분석하기, VBA 활용
IPA(Importance Performance Analysis) 분석이란 응답자가 지각하는 특정 요소에 대한 성과(만족도)와 중요도를 각각 X와 Y축으로 하는 2차원상의 평면위에 좌표로 각 요소를 표현하는 분석방법을 말합니다.
응답자가 인식하는 중요도와 다른 하나의 변수(만족도, 성과, 필요도 등)와 비교하는 것인데, 같은 질문에 대해 두가지 속성으로 물어보는 경우 사분면으로 그려서 시각적으로 보여줄 수 있어 유용합니다.
방법은 항목별 평균을 전체평균을 기준으로 그보다 높은가 낮은가를 비교하는 방식이라 구현이 그렇게 어려운 것은 아닙니다.
다만 그래프로 시각화하는 과정이 손이 많이 가는 바, VBA로 그래프를 만드는 과정을 자동화해 보았습니다.
아래는 마우스를 사용해 데이터 입력값의 범위를 정할 수 있는 버전입니다. 내용은 같습니다.
다운 받으시면, 매크로로 구성되어 있어 제대로 작동하지 않습니다.
반드시 파일을 선택하고 마우스 오른쪽을 클릭해 "속성"에서 "차단 해제"를 선택(체크)해 주셔야 합합니다.
'[정보] IT정보&활용' 카테고리의 다른 글
[한컴한글] 제목 셀을 세로로... (0) | 2025.04.23 |
---|---|
구글 스프레드 시트에서 날짜와 시간을 계산하는 방법 (0) | 2025.01.10 |
PDF 나누기(split) (2) | 2024.11.06 |
PDF 파일 합치기(수정) (1) | 2024.11.01 |
[구글 Apps Script] PDF로 출력하기 (0) | 2024.10.23 |
설정
트랙백
댓글
글
PDF 나누기(split)
PDF를 두개로 나누는 html입니다.
pdf-lib (MIT 라이선스): https://github.com/Hopding/pdf-lib
pdf.js (Apache 2.0 라이선스): https://github.com/mozilla/pdf.js
위 라이브러리를 사용하였으며, chatGPT 등의 도움을 받아 실습 삼아 만들어 보았습니다.
아래는 html 스크립트 입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>PDF 나누기 (Split)</title>
<!-- pdf-lib 및 pdf.js 라이브러리 로드 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf-lib/1.17.1/pdf-lib.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-color: #f3f4f6;
margin: 0;
}
.container {
width: 100%;
max-width: 500px;
padding: 20px;
background: white;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
h1 {
font-size: 24px;
color: #333;
text-align: center;
}
p {
font-size: 14px;
color: #555;
text-align: left;
}
input[type="file"] {
width: 100%;
padding: 10px;
margin: 10px 0;
font-size: 14px;
}
input[type="number"] {
width: 50%;
padding: 10px;
margin: 10px 0;
font-size: 14px;
}
#split-button {
width: 100%;
padding: 12px;
background-color: #28a745;
color: white;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
margin-top: 10px;
}
#split-button:hover {
background-color: #218838;
}
footer {
text-align: left;
font-size: 12px;
color: #777;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<h1>PDF 나누기</h1>
<p>PDF를 두 개의 파일로 나눌 수 있습니다.</p>
<p>1. "파일 선택" 버튼을 눌러 나눌 PDF 파일을 선택하세요.</p>
<input type="file" id="file-input" accept="application/pdf" />
<p>2. 나눌 페이지 번호를 입력하세요. <br>
(예: 3을 입력하면 1-3페이지와 4-마지막 페이지로 나뉩니다.)</p>
<input type="number" id="split-page" min="1" />
<p>3. "PDF 나누기" 버튼을 누르세요.</p>
<button id="split-button">PDF 나누기</button>
<footer>
<p><strong>사용된 라이브러리</strong></p>
<ul>
<li>pdf-lib (MIT 라이선스): <a href="https://github.com/Hopding/pdf-lib">https://github.com/Hopding/pdf-lib</a></li>
<li>pdf.js (Apache 2.0 라이선스): <a href="https://github.com/mozilla/pdf.js">https://github.com/mozilla/pdf.js</a></li>
</ul>
</footer>
</div>
<script>
const fileInput = document.getElementById('file-input');
const splitPage = document.getElementById('split-page');
const splitButton = document.getElementById('split-button');
splitButton.addEventListener('click', async () => {
if (!fileInput.files[0]) {
alert('PDF 파일을 선택해주세요.');
return;
}
const pageNumber = parseInt(splitPage.value);
if (isNaN(pageNumber) || pageNumber < 1) {
alert('유효한 페이지 번호를 입력해주세요.');
return;
}
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
const pdfDoc = await PDFLib.PDFDocument.load(arrayBuffer);
if (pageNumber >= pdfDoc.getPageCount()) {
alert('입력한 페이지 번호가 PDF의 총 페이지 수보다 크거나 같습니다.');
return;
}
// 첫 번째 PDF 생성 (1부터 pageNumber까지)
const firstPdf = await PDFLib.PDFDocument.create();
const firstPages = await firstPdf.copyPages(pdfDoc, Array.from({length: pageNumber}, (_, i) => i));
firstPages.forEach(page => firstPdf.addPage(page));
// 두 번째 PDF 생성 (pageNumber+1부터 끝까지)
const secondPdf = await PDFLib.PDFDocument.create();
const secondPages = await secondPdf.copyPages(pdfDoc, Array.from({length: pdfDoc.getPageCount() - pageNumber}, (_, i) => i + pageNumber));
secondPages.forEach(page => secondPdf.addPage(page));
// PDF 저장 및 다운로드
const firstPdfBytes = await firstPdf.save();
const secondPdfBytes = await secondPdf.save();
downloadPdf(firstPdfBytes, 'split_first.pdf');
downloadPdf(secondPdfBytes, 'split_second.pdf');
});
function downloadPdf(pdfBytes, fileName) {
const blob = new Blob([pdfBytes], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = fileName;
a.click();
URL.revokeObjectURL(url);
}
</script>
</body>
</html>
'[정보] IT정보&활용' 카테고리의 다른 글
구글 스프레드 시트에서 날짜와 시간을 계산하는 방법 (0) | 2025.01.10 |
---|---|
엑셀로 IPA 분석하기, VBA 활용 (1) | 2024.11.29 |
PDF 파일 합치기(수정) (1) | 2024.11.01 |
[구글 Apps Script] PDF로 출력하기 (0) | 2024.10.23 |
[구글 스프레드 시트] 서명받기 (0) | 2024.08.27 |
RECENT COMMENT