일상의 업무 적으로 정말 많이 사용하는 문서 중에 PDF 파일이 있습니다.
보고서 용으로 PDF 파일을 만들기도 하고, 다른 사람에게 전달하거나 인터넷에 공유할 목적으로 PDF 파일을 만들기도 합니다.
임의의 PDF 파일이나 또는 지정된 폴더에 있는 모든 PDF 파일에 대해 일괄적으로 PDF 문서 페이지 마다 워터마크(Watermark)를 삽입해야 하는 경우가 있습니다.
소속 단체 이름이나 특정 문구를 모든 pdf 문서 페이지에 워터마크(Watermark)로 삽입해야 하는 경우 어떻게 하면 좋을까요?
별도의 PDF 편집 소프트웨어 없고, Acrobat Reader와 같이 PDF 파일 읽기 전용 소프트웨어만 설치된 PC라면 워터마크를 삽입하는 일은 더욱 힘들어 지게 됩니다.
이번 글에서는 간단하게 개발할 수 있는 C#으로 PDF 파일에 워터마크(Watermark)를 삽입한 프로그램 소스 및 실행 결과에 대해 설명해 보겠습니다.
C#으로 PDF 파일에 워터마크를 삽입하는 프로그램 설명
▶ 다음 단락의 전체 C# 프로그램 소스를 확인하기 전에 프로그램 소스에 대한 간단한 설명입니다.
- 선택한 폴더에 있는 모든 PDF 파일에 대해 전체 페이지에 동일한 문구의 워터마크를 삽입합니다.
- 워터마크가 삽입된 PDF 파일은 선택한 폴더의 ‘Output’ 이라는 하위 폴더를 만들어 동일한 PDF 파일 이름으로 저장됩니다.
- 글자 크기, 워터마크 투명도, 기울기, 삽입될 위치(X축, Y축)를 지정할 수 있도록 하였습니다.
- 항상 워터마크가 보일 수 있도록 PDF 문서의 모든 Layer 최상위에 위치하도록 했습니다.
- 한글을 표시하기 위해 ‘malgun.ttf’로 Font를 지정했습니다.
중요) iTextSharp 라이브러리를 참조로 사용해서 개발하였습니다. (AGPL라이센스, 인터넷에서 쉽게 구할 수 있다)
using iTextSharp.text;
using iTextSharp.text.pdf;
C#으로 PDF 파일에 워터마크를 삽입하는 프로그램 전체 소스
▼ 아래 C# 프로그램 소스는 PDF 파일에 워터마크를 삽입하는 실제 프로그램 전체 소스입니다.
using System;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace PDFWatermark
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnWatermark_Click(object sender, EventArgs e)
{
if (txtSelectedPath.Text == “”)
{
MessageBox.Show(“폴드를 먼저 선택하세요.”);
return;
}
if (txtText.Text == “”)
{
MessageBox.Show(“워터마크 내용을 입력하세요.”);
return;
}
if (txtFontSize.Text == “” || txtOpacity.Text == “” || txtRotation.Text == “”)
{
MessageBox.Show(“글자크기, 투명도, 기울기를 모두 입력하세요.”);
return;
}
if (radioButton2.Checked && (txtX.Text == “” || txtY.Text == “”))
{
MessageBox.Show(“위치 X, Y 값을 모두 입력하세요.”);
return;
}
string OutputPath = txtSelectedPath.Text + @”\Output\”;
DirectoryInfo directoryInfo = new DirectoryInfo(txtSelectedPath.Text + @“\Output”);
if (directoryInfo.Exists == false)
directoryInfo.Create();
DirectoryInfo di = new DirectoryInfo(txtSelectedPath.Text);
FileInfo[] files = di.GetFiles();
progressBar1.Minimum = 0;
progressBar1.Maximum = files.Length;
int iCount = 0;
foreach (FileInfo file in di.GetFiles())
{
if (file.Extension.ToLower().CompareTo(“.pdf”) == 0)
{
PdfReader reader = new PdfReader(file.FullName);
FileStream fs = new FileStream(OutputPath + file.Name, FileMode.Create, FileAccess.Write, FileShare.None);
using (PdfStamper stamper = new PdfStamper(reader, fs))
{
int pageCount = reader.NumberOfPages;
PdfLayer layer = new PdfLayer(“WatermarkLayer”, stamper.Writer);
for (int i = 1; i <= pageCount; i++)
{
iTextSharp.text.Rectangle rec = reader.GetPageSize(i);
PdfContentByte cb = stamper.GetOverContent(i); //.GetUnderContent(i);
cb.BeginLayer(layer);
BaseFont baseFont = BaseFont.CreateFont(@“C:\Windows\Fonts\malgun.ttf”, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 15);
cb.SetFontAndSize(baseFont, int.Parse(txtFontSize.Text));
PdfGState gstate = new PdfGState();
gstate.FillOpacity = float.Parse(txtOpacity.Text); // 0.30f;
cb.SetGState(gstate);
cb.SetColorFill(BaseColor.BLACK);
cb.BeginText();
if (radioButton1.Checked)
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, txtText.Text, rec.Width / 2, rec.Height / 2, float.Parse(txtRotation.Text)); //45f
else
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, txtText.Text, int.Parse(txtX.Text), int.Parse(txtY.Text), float.Parse(txtRotation.Text));
cb.EndText();
cb.EndLayer();
}
}
fs.Close();
reader.Close();
}
iCount += 1;
progressBar1.Value = iCount;
}
MessageBox.Show(“워터마크 삽입이 완료되었습니다.”);
}
private void btnSelectFolder_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
txtSelectedPath.Text = dialog.SelectedPath;
}
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
if (radioButton1.Checked)
{
radioButton2.Checked = false;
txtX.Enabled = false;
txtY.Enabled = false;
}
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
if (radioButton2.Checked)
{
radioButton1.Checked = false;
txtX.Enabled = true;
txtY.Enabled = true;
}
}
}
}
|
C#으로 PDF 파일에 워터마크를 삽입하는 프로그램 실행 화면 및 실행 결과
▼ 앞 단락의 C# 프로그램을 실행했을 때의 실행 화면입니다.
▼ 프로그램을 실행해서 워터마크가 삽입된 PDF 파일의 실제 문서 화면입니다.
※ 글을 마무리하면서 C#으로 생각보다 쉽게 PDF 문서에 워터마크를 삽입하는 프로그램을 구현할 수 있음을 알 수 있습니다.
대량의 PDF 파일에 워터마크를 삽입해야 하는 경우 간단한 C# 프로그램으로 구현해 보는 것도 좋은 방법이라 생각됩니다.
※ 혹시라도 C# 프로젝트 프로그램이 필요하신 분은 댓글로 남겨 주시면 C# 프로젝트 소스를 메일로 보내드리겠습니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^