PDFレポート、銀行取引明細書、規制提出書類のフォルダがあり、その中に閉じ込められたテーブルがある — そして、それらの数値をExcelに取り込んで並べ替え、フィルター、数式の実行を行う必要がある場合。PDFからのコピー&ペーストは列の整列を保つことがほとんどなく、何百ものファイルを手作業で再フォーマットするのは仕事ではなく罰です。Total PDF Converter Xは、GUIなしでMicrosoft Excelのインストールも不要で、コマンドラインからPDFファイルのテーブルをXLSワークブックにバッチ抽出します。Windowsサーバーにインストールし、スクリプトやActiveX経由で呼び出して、無人で実行できます。
*.pdf)を指定するだけで、一致するすべてのファイルを一回の実行で処理-EachPageSeparateで各PDFページを独自のシートに書き出すか、すべてのページを1つに統合
(30日間、メール登録不要)
(サーバーライセンス、永続版)
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
PDFは最終形態のドキュメント形式です。ページは固定され、レイアウトは凍結され、その上のデータは読まれる、印刷される、ファイリングされるためのものであって — 再計算されるためのものではありません。PDFの銀行明細書は残高を見せてくれますが、利息の前提を変更して列が更新されるのを見ることはできません。PDF内のテーブルはテーブルのように見えますが、その下ではページ上の座標に配置されたテキストに過ぎません。
XLSは作業用の形式です。すべての数値は行、列、データ型を持つセルに収まります。並べ替え、フィルター、ピボット、数式の追加、グラフの描画ができ、結果を下流のモデルに供給できます。表形式データがPDFで届き、次のステップが分析である場合、データはまずXLSになる必要があります。
| XLS | ||
|---|---|---|
| 目的 | 読み取りと印刷のための最終形態の出力 | 分析と再計算のための作業用形式 |
| セルと数式 | なし — ページに配置されたテキスト | ネイティブのセル、数式、参照、グラフ |
| 並べ替えとフィルター | サポートされない | 組み込み |
| ピボットテーブル | 不可能 | ネイティブのExcel機能 |
| 手動コピー&ペーストの忠実度 | 列が頻繁に1つに崩れる | 列は分離されたまま |
| 対象者 | 読者、アーカイブ、規制当局 | アナリスト、会計士、コントローラー |
上のリンクからインストーラーをダウンロードし、Windowsサーバーまたはワークステーションで実行します。セットアップは1分以内で完了します。ブラウザやMicrosoft Excelのインストールは不要です — コンバーターは独自エンジンでPDFのテキストレイヤーを解析し、XLSファイルを直接書き出します。
cmd.exeまたはPowerShellを開きます。コンバーターの実行ファイルはPDFConverter.exeで、インストールフォルダ(通常はC:\Program Files\CoolUtils\TotalPDFConverterX\)にあります。システムPATHに追加するか、コマンドでフルパスを使用してください。
最もシンプルなコマンドは、フォルダ内のすべてのPDFファイルをXLSに変換します:
PDFConverter.exe C:\Reports\*.pdf C:\Output\ -c XLS
このコマンドはC:\Reports\内のすべての.pdfファイルを処理し、変換後のXLSワークブックをC:\Output\に保存します。各PDFから同じベース名のXLSファイルが1つ生成されます。
追加のフラグでワークブック出力を制御します:
PDFConverter.exe C:\Reports\*.pdf C:\Output\ -c XLS -EachPageSeparate -log C:\Logs\pdf2xls.log
-EachPageSeparate — 各PDFページをワークブック内の独自のシートに配置-log C:\Logs\pdf2xls.log — 検証用の変換ログを出力コマンドを.batファイルに保存し、Windowsタスクスケジューラでスケジュールします:
@echo off "C:\Program Files\CoolUtils\TotalPDFConverterX\PDFConverter.exe" C:\Incoming\*.pdf C:\Archive\XLS\ -c XLS -EachPageSeparate -log C:\Logs\pdf2xls.log
これにより、毎晩(または設定した任意の間隔で)抽出が実行され、結果を検証できるログファイルが出力されます。
Total PDF Converter Xには完全なActiveXインターフェースが含まれています。.NET、VBScript、PHP、Python、Ruby、ASPなど、あらゆるCOM互換環境からコンバーターを呼び出せます。これにより、コマンドラインプロセスを外部起動することなく、独自のWebアプリケーション、イントラネットポータル、経理ワークフローにPDF-to-XLS抽出を組み込めます。
例(C#/.NET):
PDFConverterX Cnv = new PDFConverterX();
Cnv.Convert("C:\\Reports\\statement.pdf", "C:\\Output\\statement.xls", "-c XLS -EachPageSeparate -log c:\\Logs\\pdf.log");
例(PHP):
$c = new COM("PDFConverter.PDFConverterX");
$c->convert("C:\\Reports\\statement.pdf", "C:\\Output\\statement.xls", "-c XLS -EachPageSeparate -log c:\\Logs\\pdf.log");
同じ呼び出しがASP.NET、VBScript、Python、Ruby、Perl、JavaScript(Windows Script Host)でも動作します。WebアプリケーションでアップロードされたPDFを受け取り、リアルタイムでExcelワークブックをユーザーに返すことができます。
| 機能 | オンラインコンバーター | Total PDF Converter X |
|---|---|---|
| バッチ処理 | 一度に1ファイルのみ | バッチあたりファイル数無制限 |
| ファイルのプライバシー | 明細書がサードパーティサーバーにアップロードされる | ファイルは自分のマシンから外に出ない |
| 列の整列 | 多くの場合、列が1つのセルに崩れる | テキストレイヤーから列境界を検出 |
| 複数ページのワークブック | 1シートのみ、制御不可 | -EachPageSeparateでページごとに1シート |
| 自動化 | 手動のみ | コマンドライン、.bat、タスクスケジューラ、ActiveX |
| サーバー展開 | 不可 | サーバー向け設計、GUI不要 |
| Excelのインストール必須 | 該当なし | 不要 |
| インターネット必要 | はい | いいえ |
コンバーターは有効なXLSファイルを直接書き出します。サーバーにMicrosoft Office、LibreOffice、その他のスプレッドシートプログラムをインストールする必要はありません。これによりライセンスコストを回避し、無人シナリオでのExcel自動化のよく知られた不安定さを回避できます。
Total PDF Converter Xは無人運用向けに設計されています。GUIウィンドウ、ダイアログボックス、確認プロンプトはありません。コマンドラインから、またはサービスの一部としてサイレントに実行されます — 本番サーバーに必要なものそのものです。
XLS出力には、本物のデータ型を持つ本物のセルが含まれます。数値は数値、列は列のまま保たれ、Excelの機能 — 並べ替え、フィルター、数式、ピボットテーブル、グラフ — がすぐに動作します。区切り文字付きで1つのセルにダンプされたテキストではありません — 本物のワークブックです。
同じコマンドラインツールでPDFをDOC、XLSX、CSV、HTML、TIFF、JPEG、TXTなどに変換できます。1回のインストールで必要なPDF抽出ターゲットすべてに対応します。-c XLSを-c CSVに変更するだけで、同じバッチ機能と自動化機能でCSV出力が得られます。コンバーターはテキストベースのPDFで動作することにご注意ください — 画像のみのスキャンPDFは先にOCRが必要であり、これは本製品に含まれません。
(30日間、メールやクレジットカード不要)
(サーバーライセンス、永続版)
Windows 7/8/10/11 • Server 2008/2012/2016/2019/2022
"当社では月に約180件のベンダー請求書と銀行明細書を処理しており、すべてPDFで届きます。Total PDF Converter Xは1つの.batジョブで一晩でそれらをXLSに変換します。列が正しく整列し、合計はソースと一致し、当社の照合マクロはERPからエクスポートされたファイルと同じようにワークブックを読み込みます。-EachPageSeparateフラグが決め手でした — 複数ページの明細書が口座ごとに1シートに収まるようになりました。"
Caroline Whitfield Senior Accountant, Regional Manufacturing Group
"監査人からの四半期末パッケージはPDFレポートで返ってきます。手作業でExcelに取り込むのは2日仕事でした。当社は社内のレポートツールにActiveXインターフェース経由でコンバーターを組み込み、チームはPDFをアップロードして数秒で動作するXLSを得るようになりました。ピボットテーブルと既存の分析数式が出力に対して直接動作します。サーバー上にOfficeのインストールが不要で、財務とITの両方が望んでいた点でした。"
Tobias Lindgren Financial Controller, Logistics SaaS
"サプライヤーの価格表は約30社のベンダーから毎週PDFで届きます。手作業でテーブルをコピーするのは信頼できませんでした — 列がしばしば崩れていました。コマンドラインコンバーターが毎週のロードの一部として各リストをXLSに取り込み、列境界は1社を除いて正しく検出されます(彼らのPDFは特殊なレイアウトを使用しています)。残りについては、ワークブックが価格モデルに直接供給されます。列検出フラグに関するドキュメントはもう少し詳しくしてほしいですが、サポートは同日中に返信してくれました。"
Priya Ramanathan Pricing Analyst, B2B Distributor
PDFConverter.exe C:\Reports\*.pdf C:\Output\ -c XLS です。ソースフォルダ内のすべてのPDFファイルをXLSに変換します。-EachPageSeparateを追加して各PDFページを独自のシートに、または-logで検証用ログを出力できます。-EachPageSeparateフラグを追加すると、コンバーターはPDFページごとに1つのシートを持つ複数シートワークブックを作成します。フラグなしでは、すべてのページが1つのシートに統合されます。各ページが異なる口座や期間をカバーする月次明細書に便利です。
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);
ダウンロード .NET PDF Covnerterの例
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;
無料トライアルをダウンロードして、ファイルを数分で変換。
クレジットカードもメールアドレスも不要。