PDFレポート、銀行取引明細書、規制提出書類のフォルダがあり、その中の表形式データをデータベース、スプレッドシート、または分析パイプラインに取り込む必要がある場合。PDFビューアからExcelへのコピー&ペーストでは、最初の3ページ以内に行と列の構造が崩れてしまいます。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は1行に1レコード、フィールドは区切り文字で分けるプレーンテキストデータ形式です。Excel、Google Sheets、SQLデータベース、pandas DataFrame、R、Power BI、Tableau、そして存在するすべてのETLツールに直接インポートできます。PDFに閉じ込められたデータが分析や経理のワークフローに入る必要があるとき、まずCSVになる必要があります。
| CSV | ||
|---|---|---|
| 目的 | 視覚的配布、印刷、アーカイブ | データ取り込みと分析 |
| 構造 | ページ座標、本物のテーブルなし | 行と列、ネイティブ |
| 編集 | 困難、PDFエディターが必要 | 任意のテキストエディターやスプレッドシートで開ける |
| 手動コピー&ペースト | テーブル構造を失う | 構造を正確に保持 |
| ワークフロー | パイプライン終端のドキュメント | データパイプラインの起点 |
注意: 自動化されたPDF-to-CSV抽出は、テキストベースのPDF — 会計システム、レポートエンジン、またはスプレッドシートやデータベースから「PDFとして保存」で生成されたもの — で動作します。スキャンされたPDF(紙の画像)にはテキストレイヤーがなく、CSV抽出を行う前に別途OCR前処理ステップが必要です。
上のリンクからインストーラーをダウンロードし、Windowsサーバーまたはワークステーションで実行します。セットアップは1分以内で完了します。コンバーターはPDFのテキストレイヤーを直接解析します — 外部のPDFリーダー、Acrobat、Officeのインストールは不要です。
cmd.exeまたはPowerShellを開きます。コンバーターの実行ファイルはPDFConverter.exeで、インストールフォルダ(通常はC:\Program Files\CoolUtils\TotalPDFConverterX\)にあります。システムPATHに追加するか、コマンドでフルパスを使用してください。
最もシンプルなコマンドは、フォルダ内のすべてのPDFファイルからテーブルをCSVに抽出します:
PDFConverter.exe C:\Reports\*.pdf C:\Output\ -c CSV
このコマンドはC:\Reports\内のすべての.pdfファイルを処理し、変換後のCSVファイルをC:\Output\に保存します。各PDFから同じベース名のCSVが1つ生成されます。複数ページのPDFは、デフォルトでソースファイルごとに1つの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互換環境からコンバーターを呼び出せます。これにより、コマンドラインプロセスを外部起動することなく、独自のWebアプリケーション、イントラネットポータル、ドキュメントワークフローに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)でも動作します。WebアプリケーションでアップロードされたPDFファイルを受け取り、リアルタイムでインポート可能なCSVデータをユーザーに返すことができます。
| 機能 | オンラインコンバーター | Total PDF Converter X |
|---|---|---|
| バッチ処理 | 一度に1ファイルのみ | バッチあたりファイル数無制限 |
| ファイルのプライバシー | サードパーティサーバーにアップロード | ファイルは自分のマシンから外に出ない |
| 機密データ | リスクあり — 銀行明細、給与、提出書類 | 安全 — オンプレミス処理 |
| ファイルサイズ制限 | 典型的に5~25 MBの上限 | 制限なし |
| 区切り文字制御 | 固定のカンマのみ、選択不可 | カンマ、セミコロン、タブ、パイプ |
| エンコーディング制御 | 多くの場合ANSIのみ、Unicodeが壊れる | 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などに変換できます。1回のインストールで必要な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を生成します。複数列のテーブルや結合ヘッダーが正しい構造で出力されることが、以前試した2つのツールでは決め手にならなかった点を解決しました。セミコロン区切り文字とUTF-8フラグのおかげで、欧州の発行体のインポートが崩れることもなくなりました。"
Caroline Whitfield Senior Financial Analyst, Mid-Market Equity Research
"当社は照合のために毎日数百件の銀行明細書を取り込んでいます。PDFConverter.exeをラップした.batスクリプトがCSVファイルをホットフォルダに置き、当社のETLパイプラインがそれを取り上げます。サーバー上にGUIフットプリントがゼロ、Acrobatライセンスも不要、ログファイルが監査用の証跡を提供してくれます。社内C#ツールからのActiveXテストを含めて、セットアップは約1時間で済みました。"
Rohan Mehta Data Engineer, Banking Operations
"現場の業務ではクライアントのシステムから出力されたPDFの総勘定元帳を渡されることがよくあります。それらをCSVに変換するには、面倒なコピー&ペーストか、IDEAインポートに料金を払うかのどちらかでした。今ではUSBインストール版でコンバーターを実行し、CSVを直接分析作業文書に取り込んでいます。スキャン済みPDFは依然として上流でOCRが必要ですが、ネイティブPDFについてはテーブル検出が信頼できます。ドキュメントはもう少し充実してほしいですが、サポートは1日以内に返信してくれました。"
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に含まれるドイツ語ウムラウト、ポーランド語ダイアクリティカル、キリル文字、中国語、日本語、その他のUnicode文字を保持する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.docx";
var cnv = new PDFConverterX();
cnv.Convert(src, dest, "-cDOC -log c:\\test\\PDF.log");
if (!string.IsNullOrEmpty(cnv.ErrorMessage))
throw new Exception(cnv.ErrorMessage);
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 srcPath = $@"{assemblyDirectoryPath}\src\sample.pdf";
var outPath = Path.GetTempFileName() + ".docx";
startInfo.FileName = executablePath;
if (File.Exists(outPath))
{
File.Delete(outPath);
}
if (File.Exists(executablePath) && File.Exists(srcPath))
{
sbLogs.AppendLine("files exists...");
}
else
sbLogs.AppendLine("EXE & source files NOT exists...");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = $"\"{srcPath}\" \"{outPath}\" -cDOC";
using (Process exeProcess = Process.Start(startInfo))
{
sbLogs.AppendLine($"wait...{DateTime.Now.ToString()}");
exeProcess.WaitForExit();
sbLogs.AppendLine($"complete...{DateTime.Now.ToString()}");
}
sbLogs.AppendLine("Conversion complete.");
}
catch (Exception ex)
{
sbLogs.AppendLine(ex.ToString());
}
return new OkObjectResult(sbLogs);
}
}
dim C
Set C=CreateObject("PDFConverter.PDFConverterX")
C.Convert "c:\test\source.pdf", "c:\test\dest.docx", "-cDOC -log c:\test\PDF.log"
Response.Write C.ErrorMessage
set C = nothing
dim C
Set C=CreateObject("PDFConverter.PDFConverterX")
Response.Clear
Response.AddHeader "Content-Type", "binary/octet-stream"
Response.AddHeader "Content-Disposition", "attachment; filename=test.docx"
Response.BinaryWrite C.ConvertToStream("C:\www\ASP\Source.pdf", "C:\www\ASP", "-cDOC -log c:\html.log")
set C = nothing
$src="C:\\test\\test.pdf";
$dest="C:\\test\\test.docx";
if (file_exists($dest)) unlink($dest);
$c= new COM("PDFConverter.PDFConverterX");
$c->convert($src,$dest, "-cDOC -log c:\\test\\PDF.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.docx"
c.convert(src, dest, "-cDOC -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.docx"
c.convert(src, dest, "-cDOC -log c:\\test\\PDF.log")
if not os.path.exists(dest):
print(c.ErrorMessage)
uses Dialogs, Vcl.OleAuto;
var
c: OleVariant;
begin
c := CreateOleObject('PDFConverter.PDFConverterX');
c.Convert('c:\test\source.pdf', 'c:\test\dest.docx', '-cDOC -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.docx", "-cDOC");
if (c.ErrorMessage != "")
alert(c.ErrorMessage)
use Win32::OLE; my $src = "C:\\test\\test.pdf"; my $dest = "C:\\test\\test.docx"; my $c = CreateObject Win32::OLE 'PDFConverter.PDFConverterX'; $c->convert($src, $dest, "-cDOC -log c:\\test\\PDF.log"); print $c->ErrorMessage if -e $dest;
無料トライアルをダウンロードして、ファイルを数分で変換。
クレジットカードもメールアドレスも不要。