PDF 보고서, 은행 명세서 또는 규제 신고가 가득 들어 있는 폴더가 있고, 내부의 표 형식 데이터는 데이터베이스, 스프레드시트 또는 분석 파이프라인에 들어가야 합니다. PDF 뷰어에서 테이블을 Excel로 복사-붙여넣기하면 처음 세 페이지 내에 행과 열 구조가 파괴됩니다. Total PDF Converter X는 GUI 없이 명령줄에서 PDF 파일에서 테이블을 CSV로 일괄 추출합니다. Windows 서버에 설치하고 스크립트나 ActiveX를 통해 호출하면 무인으로 실행됩니다.
*.pdf)를 전달하면 변환기가 한 번의 실행으로 일치하는 모든 파일을 처리합니다-CSVDelimiter를 통한 쉼표, 세미콜론, 탭 또는 파이프, 대상 시스템과 일치-Encoding을 통한 UTF-8, UTF-16 또는 ANSI-CSVQuotation으로 텍스트 필드 래핑
(30일, 이메일 불필요)
(서버 라이선스, 영구)
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
PDF는 시각적 배포와 인쇄용으로 설계된 고정 레이아웃 형식입니다. PDF 내부의 테이블은 구조화된 데이터 객체가 아닙니다 — 페이지의 특정 x/y 좌표에 위치한 일련의 텍스트 조각입니다. 뷰어는 테이블처럼 보이는 방식으로 렌더링하지만, 파일 자체에는 행, 열 또는 셀이 없습니다. 이것이 PDF에서 수동 복사-붙여넣기가 깨끗한 표 형식 출력을 거의 생성하지 않는 이유입니다.
CSV는 줄당 한 레코드, 구분 기호로 분리된 필드를 포함하는 일반 텍스트 데이터 형식입니다. Excel, Google Sheets, SQL 데이터베이스, pandas DataFrame, R, Power BI, Tableau 및 모든 ETL 도구로 직접 가져옵니다. PDF에 묶인 데이터가 분석 또는 회계 워크플로에 들어가야 할 때, 먼저 CSV가 되어야 합니다.
| CSV | ||
|---|---|---|
| 목적 | 시각적 배포, 인쇄, 보관 | 데이터 수집 및 분석 |
| 구조 | 페이지 좌표, 실제 테이블 없음 | 행과 열, 기본 |
| 편집 | 어려움, PDF 편집기 필요 | 모든 텍스트 편집기 또는 스프레드시트에서 열림 |
| 수동 복사-붙여넣기 | 테이블 구조를 잃음 | 구조를 정확하게 보존 |
| 워크플로 | 파이프라인 끝의 문서 | 데이터 파이프라인의 시작 |
주의: 자동화된 PDF-to-CSV 추출은 텍스트 기반 PDF에서 작동합니다 — 회계 시스템, 보고 엔진 또는 스프레드시트나 데이터베이스에서 PDF로 저장된 PDF. 스캔된 PDF(종이 이미지)에는 텍스트 레이어가 없으며, CSV 추출이 가능하기 전에 별도의 전처리 단계로 OCR이 필요합니다.
위의 링크에서 설치 프로그램을 다운로드하고 Windows 서버 또는 워크스테이션에서 실행합니다. 설치는 1분 이내에 완료됩니다. 변환기는 PDF의 텍스트 레이어를 직접 분석합니다 — 외부 PDF 리더, Acrobat, Office 설치가 필요하지 않습니다.
cmd.exe 또는 PowerShell을 엽니다. 변환기 실행 파일은 설치 폴더(일반적으로 C:\Program Files\CoolUtils\TotalPDFConverterX\)에 있는 PDFConverter.exe입니다. 시스템 PATH에 추가하거나 명령에서 전체 경로를 사용하십시오.
가장 간단한 명령은 폴더의 모든 PDF 파일에서 테이블을 CSV로 추출합니다:
PDFConverter.exe C:\Reports\*.pdf C:\Output\ -c CSV
이 명령은 C:\Reports\의 모든 .pdf 파일을 처리하고 결과 CSV 파일을 C:\Output\에 저장합니다. 각 PDF는 같은 기본 이름으로 하나의 CSV를 생성합니다. 다중 페이지 PDF는 기본적으로 소스 파일당 단일 CSV로 연결됩니다.
추가 플래그로 CSV 형식을 제어합니다:
PDFConverter.exe C:\Reports\*.pdf C:\Output\ -c CSV -CSVDelimiter ; -CSVQuotation " -Encoding UTF-8 -log C:\Logs\pdf2csv.log
-CSVDelimiter ; — 필드 구분 기호(쉼표, 세미콜론, 탭, 파이프)-CSVQuotation " — 셀 내부의 쉼표를 보호하기 위해 텍스트 필드를 큰따옴표로 래핑-Encoding UTF-8 — 비라틴 문자의 올바른 처리를 위한 출력 인코딩(UTF-8, UTF-16, ANSI)-log C:\Logs\pdf2csv.log — 확인용 변환 로그 작성명령을 .bat 파일에 저장하고 Windows 작업 스케줄러로 예약합니다:
@echo off "C:\Program Files\CoolUtils\TotalPDFConverterX\PDFConverter.exe" C:\Incoming\*.pdf C:\Archive\CSV\ -c CSV -CSVDelimiter ; -Encoding UTF-8 -log C:\Logs\pdf2csv.log
이렇게 하면 매일 밤(또는 설정한 간격으로) 추출이 실행되고 결과를 확인할 수 있는 로그 파일이 기록됩니다. 데이터베이스나 분석 웨어하우스로 CSV 파일을 가져오는 후속 단계와 함께 페어링하세요.
Total PDF Converter X에는 완전한 ActiveX 인터페이스가 포함되어 있습니다. .NET, VBScript, PHP, Python, Ruby, ASP 등 모든 COM 호환 환경에서 변환기를 호출할 수 있습니다. 이를 통해 명령줄 프로세스를 별도로 실행하지 않고도 자체 웹 애플리케이션, 인트라넷 포털 또는 문서 워크플로에 PDF-to-CSV 추출을 내장할 수 있습니다.
예제 (C#/.NET):
PDFConverterX Cnv = new PDFConverterX();
Cnv.Convert("C:\\Reports\\statement.pdf", "C:\\Output\\statement.csv", "-c CSV -CSVDelimiter ; -Encoding UTF-8 -log c:\\Logs\\pdf.log");
예제 (PHP):
$c = new COM("PDFConverter.PDFConverterX");
$c->convert("C:\\Reports\\statement.pdf", "C:\\Output\\statement.csv", "-c CSV -CSVDelimiter ; -Encoding UTF-8 -log c:\\Logs\\pdf.log");
동일한 호출이 ASP.NET, VBScript, Python, Ruby, Perl, JavaScript(Windows Script Host)에서도 작동합니다. 웹 애플리케이션에서 업로드된 PDF 파일을 수신하고 실시간으로 가져올 준비가 된 CSV 데이터를 사용자에게 반환할 수 있습니다.
| 기능 | 온라인 변환기 | Total PDF Converter X |
|---|---|---|
| 일괄 처리 | 한 번에 한 파일 | 배치당 무제한 파일 |
| 파일 프라이버시 | 파일이 제3자 서버에 업로드됨 | 파일이 사용자 컴퓨터를 떠나지 않음 |
| 기밀 데이터 | 위험함 — 은행 명세서, 급여, 신고 | 안전함 — 온프레미스 처리 |
| 파일 크기 제한 | 일반적으로 5–25 MB 제한 | 제한 없음 |
| 구분 기호 제어 | 고정 쉼표, 선택 없음 | 쉼표, 세미콜론, 탭, 파이프 |
| 인코딩 제어 | 종종 ANSI만, 유니코드 깨짐 | UTF-8, UTF-16, ANSI 선택 가능 |
| 자동화 | 수동 전용 | 명령줄, .bat, 작업 스케줄러, ActiveX |
| 서버 배포 | 불가능 | 서버용 설계, GUI 불필요 |
| 인터넷 필요 | 예 | 아니오 |
변환기는 PDF의 텍스트 레이어를 분석하고 좌표와 정렬을 기반으로 행과 열 구조를 재구성합니다. 다중 열 보고서 레이아웃, 병합된 헤더, 여러 페이지에 걸친 테이블이 분리된 단어 문자열이 아니라 한 번에 처리됩니다.
Total PDF Converter X는 무인 사용을 위해 설계되었습니다. GUI 창, 대화 상자, 확인 프롬프트, Acrobat 종속성이 없습니다. 명령줄 또는 서비스의 일부로 조용히 실행됩니다 — 프로덕션 추출 파이프라인에 필요한 바로 그 방식입니다.
독일어 움라우트, 폴란드어 발음 부호, 키릴 문자 가맹점 이름 또는 중국어 거래 상대방이 있는 은행 명세서가 CSV 출력에서 읽을 수 있게 유지됩니다. 명령줄에서 -Encoding UTF-8을 사용하면 결과 파일이 모든 최신 데이터베이스 또는 BI 도구로 깨끗하게 가져옵니다.
같은 명령줄 도구로 PDF를 DOC, XLS, HTML, TXT, TIFF, JPEG 등으로 변환할 수 있습니다. 하나의 설치로 필요한 모든 PDF 변환 대상을 다룹니다. -c CSV를 -c XLS로 변경하면 동일한 일괄 처리 및 자동화 기능으로 Excel 워크북을 얻을 수 있습니다.
(30일, 이메일이나 신용카드 불필요)
(서버 라이선스, 영구)
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
"분기별 실적 발표가 PDF로 도착하고 우리는 이를 Excel로 모델링합니다. Total PDF Converter X는 명령줄에서 10-Q 신고 폴더 전체에 대해 실행되며 1분 이내에 깨끗한 CSV를 생성합니다. 다중 열 테이블과 병합된 헤더가 올바르게 구조화되어 나오는데, 이것이 우리가 시도한 두 가지 이전 도구의 결정적 결함이었습니다. 세미콜론 구분 기호와 UTF-8 플래그는 유럽 발행자가 더 이상 우리 가져오기를 망가뜨리지 않는다는 것을 의미합니다."
Caroline Whitfield Senior Financial Analyst, Mid-Market Equity Research
"조정을 위해 매일 수백 개의 은행 명세서를 수집합니다. PDFConverter.exe 주위의 .bat 스크립트 래퍼는 CSV 파일을 핫 폴더에 떨어뜨리고 ETL 파이프라인이 이를 가져옵니다. 서버에 GUI 풋프린트 0, Acrobat 라이선스 없음, 로그 파일은 감사를 위한 종이 추적을 제공합니다. 내부 C# 도구에서 ActiveX 테스트를 포함한 설정에 약 1시간이 걸렸습니다."
Rohan Mehta Data Engineer, Banking Operations
"현장 약속에서는 종종 클라이언트 시스템에서 PDF 일반 원장을 받습니다. 이를 CSV로 변환하는 것은 지루한 복사-붙여넣기 또는 IDEA 가져오기 비용을 의미했습니다. 이제 USB 설치 사본에서 변환기를 실행하고 CSV를 분석 작업 문서로 직접 로드합니다. 스캔된 PDF는 여전히 업스트림 OCR이 필요하지만, 네이티브 PDF의 경우 테이블 감지가 신뢰할 수 있습니다. 문서가 더 철저할 수 있지만 지원팀은 하루 안에 답변했습니다."
Anika Larsen Audit Specialist, Big Four Practice
PDFConverter.exe C:\Reports\*.pdf C:\Output\ -c CSV입니다. 이 명령은 소스 폴더의 모든 PDF에서 테이블을 추출하여 CSV 파일로 작성합니다. 출력을 제어하려면 -CSVDelimiter ;, -Encoding UTF-8 또는 -log 같은 플래그를 추가하세요.-CSVDelimiter 다음에 문자를 사용하세요. 세미콜론(쉼표가 소수점 구분 기호인 유럽 로케일에서 일반적)의 경우 -CSVDelimiter ;, 탭의 경우 -CSVDelimiter \t 또는 파이프의 경우 -CSVDelimiter |를 사용합니다. 기본값은 쉼표입니다.-Encoding UTF-8을 추가하세요. 이는 PDF에 있는 독일어 움라우트, 폴란드어 발음 부호, 키릴 문자, 중국어, 일본어 및 기타 모든 유니코드 문자를 보존하는 UTF-8 인코딩 CSV 파일을 생성합니다. UTF-16과 ANSI도 지원됩니다.-CSVQuotation "를 사용하여 텍스트 필드를 큰따옴표로 래핑하세요. 변환기는 RFC 4180에 따라 임베디드 따옴표를 이스케이프하므로 "Smith, John" 같은 값이 열 수를 깨뜨리지 않고 Excel, pandas 또는 표준 CSV 파서로 왕복하여 살아남습니다.PDFConverter.PDFConverterX)로 등록됩니다. .NET, PHP, Python, VBScript, ASP, Ruby, Perl 및 기타 모든 COM 호환 환경에서 호출하여 PDF-to-CSV 추출을 애플리케이션에 직접 내장할 수 있습니다.
string src="C:\\test\\Source.PDF";
string dest="C:\\test\\Dest.TIFF";
PDFConverterX Cnv = new PDFConverterX();
Cnv.Convert(src, dest, "-c TIFF -log c:\\test\\PDF.log");
MessageBox.Show("Convert complete!");
//양식 작업
Cnv.LoadFromFile(src);
Cnv.SetFormFieldValue(0, "Test Name");
Cnv.SaveToFile(src);
public static class Function1
{
[FunctionName("Function1")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
StringBuilder sbLogs = new StringBuilder();
sbLogs.AppendLine("started...");
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
var assemblyDirectoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
assemblyDirectoryPath = assemblyDirectoryPath.Substring(0, assemblyDirectoryPath.Length - 4);
var executablePath = $@"{assemblyDirectoryPath}\Converter\PDFConverterX.exe";
sbLogs.AppendLine(executablePath + "...");
var msgPath = $@"{assemblyDirectoryPath}\MSG\MSG.pdf";
var outPath = Path.GetTempFileName() + ".tiff";
startInfo.FileName = executablePath;
if (File.Exists(outPath))
{
File.Delete(outPath);
}
if (File.Exists(executablePath) && File.Exists(msgPath))
{
sbLogs.AppendLine("files exists...");
}
else
sbLogs.AppendLine("EXE & MSG files NOT exists...");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = $"{msgPath} {outPath}";
using (Process exeProcess = Process.Start(startInfo))
{
sbLogs.AppendLine($"wait...{DateTime.Now.ToString()}");
exeProcess.WaitForExit();
sbLogs.AppendLine($"complete...{DateTime.Now.ToString()}");
}
int sleepCounter = 10;
while(!File.Exists(outPath) && sleepCounter > 0)
{
System.Threading.Thread.Sleep(1000);
sbLogs.AppendLine("sleep...");
sleepCounter--;
}
if (File.Exists(outPath))
sbLogs.AppendLine("Conversion complete successfully.");
}
catch (Exception ex)
{
sbLogs.AppendLine(ex.ToString());
}
return new OkObjectResult(sbLogs);
}
}
#include <windows.h>
static const CLSID CLSID_PDFConverterX =
{0x6B411E7E, 0x9503,0x4793,{0xA2, 0x87, 0x1F, 0x3B, 0xA8, 0x78, 0xB9, 0x1C}};
static const IID IID_IPDFConverterX =
{0xEF633BED, 0xC414,0x49B0,{0x91, 0xFB, 0xC3, 0x9C, 0x3F, 0xE0, 0x08, 0x0D}};
#undef INTERFACE
#define INTERFACE IPDFConverterX
DECLARE_INTERFACE_(IPDFConverterX, IDispatch)
{
STDMETHOD(QueryInterface)(THIS_ REFIID, PVOID*) PURE;
STDMETHOD(Convert)(THIS_ LPCTSTR, LPCTSTR, LPCTSTR) PURE;
STDMETHOD(About)(THIS) PURE;
//const SourceFile: WideString; const DestFile: WideString; const Params: WideString; safecall;
};
typedef HRESULT (__stdcall *hDllGetClassObjectFunc) (REFCLSID, REFIID, void **);
int main () {
HRESULT hr;
if (CoInitialize(NULL)) {
printf ("Error in CoInitialize.");
return -1;
}
LPCTSTR lpFileName = "PDFConverter.dll";
HMODULE hModule;
hModule = LoadLibrary (lpFileName);
printf ("hModule: %d\n", hModule);
if (hModule == 0) {
printf ("Error in LoadLibrary.");
return -1;
}
hDllGetClassObjectFunc hDllGetClassObject = NULL;
hDllGetClassObject = (hDllGetClassObjectFunc) GetProcAddress (hModule, "DllGetClassObject");
if (hDllGetClassObject == 0) {
printf ("Error in GetProcAddress.");
return -1;
}
IClassFactory *pCF = NULL;
hr = hDllGetClassObject (&CLSID_PDFConverterX, &IID_IClassFactory, (void **)&pCF);
/* Can't load with different ID */
printf ("hr hDllGetClassObject: %d\n", hr);
if (!SUCCEEDED (hr)) {
printf ("Error in hDllGetClassObject.");
return -1;
}
IPDFConverterX *pIN;
hr = pCF->lpVtbl->CreateInstance (pCF, 0, &IID_IPDFConverterX, (void **)&pIN);
printf ("hr CreateInstance: %d\n", hr);
if (!SUCCEEDED (hr)) {
printf ("Error in hDllGetClassObject.");
return -1;
}
hr = pCF->lpVtbl->Release (pCF);
printf ("hr Release: %d\n", hr);
if (!SUCCEEDED (hr)) {
printf ("Error in Release.");
return -1;
}
hr = pIN->lpVtbl->About (pIN);
printf ("hr About: %d\n", hr);
if (!SUCCEEDED (hr)) {
printf ("Error in About.");
return -1;
}
hr = pIN->lpVtbl->Convert (pIN, "test.pdf", "test.html","-cHTML");
printf ("hr Convert: %d\n", hr);
if (!SUCCEEDED (hr)) {
printf ("Error in Convert.");
return -1;
}
return 0;
}
dim C
Set C=CreateObject("PDFConverter.PDFConverterX")
C.Convert "c:\source.PDF", "c:\dest.HTML", "-cHTML -log c:\pdf.log"
set C = nothing
dim C
Set C=CreateObject("PDFConverter.PDFConverterX")
Response.Clear
Response.AddHeader "Content-Type", "binary/octet-stream"
Rresponse.AddHeader "Content-Disposition", "attachment; filename=test.TIFF"
Response.BinaryWrite c.ConvertToStream("C:\www\ASP\Source.PDF", "C:\www\ASP", "-cTIFF -log c:\PDF.log")
set C = nothing
$src="C:\\test.pdf";
$dest="C:\\test.tiff";
if (file_exists($dest)) unlink($dest);
$c= new COM("PDFConverter.PDFConverterX");
$c->convert($src,$dest, "-c TIFF -log c:\doc.log");
if (file_exists($dest)) echo "OK"; else echo "fail:".$c->ErrorMessage;
require 'win32ole'
c = WIN32OLE.new('PDFConverter.PDFConverterX')
src="C:\\test\\test.pdf";
dest="C:\\test\\test.tiff";
c.convert(src,dest, "-c TIFF -log c:\\test\\PDF.log");
if not File.exist?(dest)
puts c.ErrorMessage
end
import win32com.client
import os.path
c = win32com.client.Dispatch("PDFConverter.PDFConverterX")
src="C:\\test\\test.pdf";
dest="C:\\test\\test.tiff";
c.convert(src, dest, "-c TIFF -log c:\\test\\PDF.log");
if not os.path.exists(file_path):
print(c.ErrorMessage)
uses Dialogs, Vcl.OleAuto;
var
c: OleVariant;
begin
c:=CreateOleObject('PDFConverter.PDFConverterX');
C.Convert('c:\test\source.pdf', 'c:\test\dest.tiff', '-c TIFF -log c:\test\PDF.log');
IF c.ErrorMessage<> Then
ShowMessage(c.ErrorMessage);
end;
var c = new ActiveXObject("PDFConverter.PDFConverterX");
c.Convert("C:\\test\\source.pdf", "C:\\test\\dest.tiff", "-c TIFF");
if (c.ErrorMessage!="")
alert(c.ErrorMessage)
use Win32::OLE; my $src="C:\\test\\test.pdf"; my $dest="C:\\test\\test.tiff"; my $c = CreateObject Win32::OLE 'PDFConverter.PDFConverterX'; $c->convert($src,$dest, "-c TIFF -log c:\\test\\PDF.log"); print $c->ErrorMessage if -e $dest;
무료 평가판을 다운로드하고 몇 분 만에 파일을 변환하세요.
신용카드나 이메일이 필요하지 않습니다.