私はしばらくの間オンラインで探していましたが、ドキュメント自体や印刷ダイアログを表示せずにDelphiでPDFファイルを印刷する方法がわかりませんでした。ただ、ファイルを表示せずに開き、デフォルトのプリンターで印刷します。
PDFドキュメントのバッチを印刷しようとしていますが、ユーザーの介入は必要ありません。
PDFを印刷するには、いくつかの異なる可能性があります... Adobe Readerのインストールが必要かどうかによって異なります(ツールを配布するか、自分で使用するかはわかりません)。
1)Adobe ReaderのActiveXコントロールをロードして、印刷に使用することができます
pdfFile.src := 'filename.pdf';
pdfFile.LoadFile('filename.pdf');
pdfFile.print;
2)Adobe Reader自体でPDFを印刷できます(FoxItでも実行できます)
ShellExecute(0, 'open', 'acrord32', PChar('/p /h ' + FileName), nil, SW_HIDE);
3)GhostviewとGhostprintを使用することもできます
ShellExecute(Handle, 'open', 'gsprint.exe', PChar('"' + filename + '"'), '', SW_HIDE);
4)または、サードパーティのライブラリを使用することもできます...利用可能なものもありますが、すべてが無料というわけではありません
これが私のライブラリーに書いたたくさんのルーチンです。 PDFファイルをパラメーターとしてPrintUsingShellに渡すと、Acrobatリーダープログラムがインストールされている場合に印刷されます(他のpdfソフトウェアでも動作する可能性があります)レジストリに自分自身を登録しました)。
PrintUsingShell( x );
procedure PrintUsingShell( psFileName :string);
var s : string;
i : integer;
begin
if not FileExists(psFileName)
then
Exit;
s := FindShellPrintCmd( ExtractFileExt(psFileName) );
i := Pos('%1',s);
if i > 0
then begin
System.Delete(s,i,2);
System.Insert(psFileName,s,i);
Execute(s);
end;
end;
function FindShellCmd(psExtension:string;psCmd:string): string;
var r : TRegistry;
sName : string;
begin
psExtension := Trim(psExtension);
if psExtension = ''
then begin
Result := '';
Exit;
end;
psCmd := Trim(psCmd);
if psCmd = ''
then
psCmd := 'OPEN'
else
psCmd := UpperCase(psCmd);
if psExtension[1] <> '.'
then
psExtension := '.' + psExtension;
r := TRegistry.Create(KEY_READ);
try
r.RootKey := HKEY_LOCAL_MACHINE;
r.OpenKeyReadOnly('software\classes\' + psExtension);
sName := r.ReadString('');
r.CloseKey();
r.OpenKeyReadOnly('software\classes\' + sName + '\Shell\' + psCmd + '\Command');
Result := r.ReadString('');
r.CloseKey();
finally
FreeAndNil(r);
end;
end;
function FindShellOpenCmd(psExtension:string):string;
begin
Result := FindShellCmd(psExtension,'OPEN');
end;
function FindShellPrintCmd(psExtension:string):string;
begin
Result := FindShellCmd(psExtension,'PRINT');
end;
{$ifdef windows}
function LocalExecute( psExeName:string ; wait:boolean ; how:Word):Word;
var i : integer;
prog,parm:string;
msg:TMsg;
rc : Word;
begin
i := pos(psExeName,' ');
if i = 0
then begin
prog := psExeName;
parm := '';
end
else begin
prog := copy( psExeName,1,i-1);
parm := copy( psExeName,i+1,255);
end;
if pos(prog,'.') <> 0
then
prog := prog + '.exe';
psExeName := prog + ' ' + parm + #0;
rc := WinExec( @psExeName[1] , how );
if wait
then begin
if (rc > 32)
then begin
repeat
if PeekMessage(Msg,0,0,0,PM_REMOVE)
then begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
until (GetModuleUsage(rc) = 0)
end;
end;
end; { LocalExecute }
{$endif}
{$ifdef win32}
function LocalExecute32(FileName:String; Wait:boolean; Visibility : integer;
lWaitFor:Cardinal=INFINITE):integer;
var zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) { pointer to PROCESS_INF }
then Result := -1
else begin
if Wait
then begin
Result := WaitforSingleObject(ProcessInfo.hProcess,lWaitFor);
GetExitCodeProcess(ProcessInfo.hProcess,LongWord(Result));
end;
end;
end;
{$endif}
function Execute( psExeName:string):integer;
begin
{$ifdef windows} result := LocalExecute(psExeName, false , SW_SHOW); {$endif}
{$ifdef win32} result := LocalExecute32(psExeName, false , SW_SHOW); {$endif}
end;
注:これらをDelphiのバージョンとオペレーティングシステムで試してみてください(私はDelphi 7で開発し、Windows XPで使用しました)。
ネイティブ印刷が必要な場合(Acrobat Readerをインストールしていませんが、最近Acrobat Readerをインストールしていない人はいますか?)、次のコンポーネントセットを検討してください。 WpCubedのPdft印刷コンポーネント 。
[〜#〜]更新[〜#〜]
リクエストに応じて、ライブラリから実行関数を追加しました...
DelphiからAdobeReaderを使用せずに、PDFをプリンタに印刷するには、 Debenu Quick PDF Library を使用します。 4からXE8までのDelphiのすべてのバージョン。最初にプレビューせずにプログラムでPDFを印刷するためのサンプルコード:
procedure TForm6.PrintDocumentClick(Sender: TObject);
var
iPrintOptions: Integer;
begin
DPL := TDebenuPDFLibrary1115.Create;
try
UnlockResult := DPL.UnlockKey('...'); // Add trial license key here
if UnlockResult = 1 then
begin
// Load your file
DPL.LoadFromFile('test.pdf', '');
// Configure print options
iPrintOptions := DPL.PrintOptions(0, 0, 'Printing Sample');
// Print the current document to the default printing
// using the options as configured above
DPL.PrintDocument(DPL.GetDefaultPrinterName(), 1, 1, iPrintOptions);
end;
finally
DPL.Free;
end;
end;
カスタマープリンタ機能 を使用して、より高度な印刷オプションも利用できます。これは無料のSDKではありませんが、まさにあなたが望むことを実行します。
フォルダ内のすべてのファイルをプリンタに送信する「AutoPrint」と呼ばれるシェアウェアプログラムがあります。費用は35ドルです。 (あなたが多くの顧客を持っていない場合)。
そうでなければ、誰かが同じことをするコードを修正できれば素晴らしいでしょう。