2010-01-13 22 views
13

मैं अब कुछ समय के लिए ऑनलाइन देख रहा हूं, लेकिन मुझे अभी भी पता नहीं चला है कि दस्तावेज़ को स्वयं दिखाए बिना, या एक प्रिंट संवाद के बिना डेल्फी में पीडीएफ फ़ाइल कैसे मुद्रित करें। मैं बस इसे दिखाए बिना फ़ाइल खोलना चाहता हूं, और इसे डिफ़ॉल्ट प्रिंटर पर प्रिंट करना चाहता हूं।डेल्फी: इसे दिखाए बिना पीडीएफ कैसे मुद्रित करें?

मैं पीडीएफ दस्तावेजों के एक बैच को मुद्रित करने की कोशिश कर रहा हूं, और उपयोगकर्ता हस्तक्षेप की कोई आवश्यकता नहीं है।

उत्तर

15

पीडीएफ प्रिंट करने के लिए कुछ अलग-अलग संभावनाएं हैं ... यह निर्भर करता है कि आपको एडोब रीडर स्थापित करने की आवश्यकता हो सकती है (मुझे नहीं पता कि आप अपना टूल वितरित करना चाहते हैं या बस इसे स्वयं उपयोग करना चाहते हैं)।

1) यह एडोब रीडर के ActiveX नियंत्रण लोड और मुद्रण

pdfFile.src := 'filename.pdf'; 
pdfFile.LoadFile('filename.pdf'); 
pdfFile.print; 

2 के लिए इसका इस्तेमाल करते हैं) आप एडोब रीडर के साथ ही पीडीएफ़ मुद्रित कर सकते हैं (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) या फिर आप पर इस्तेमाल कर सकते हैं इस्तेमाल कर सकते हैं hird पार्टी पुस्तकालय ... वहाँ कुछ उपलब्ध हैं, लेकिन उनमें से सभी के लिए स्वतंत्र हैं

+0

Thx! मुझे नहीं लगता कि मैं खोल समाधान का उपयोग कर सकता हूं। जिस कार्यक्रम पर मैं काम कर रहा हूं वह एक कस्टम-निर्मित ईआरपी है और प्रिंटिंग क्लाइंट-साइड पर किया जाना है। मुझे लगता है कि पहले विकल्प के लिए उपयोगकर्ता को एडोब रीडर स्थापित करने की आवश्यकता होती है? तीसरे पक्ष के पुस्तकालय भी बहुत उपयोगी हैं, लेकिन केवल परीक्षण मुफ्त में हैं :) मुझे अपने मालिक से बात करनी होगी, लेकिन हम एक कड़े बजट पर हैं;) – Liezzzje

+0

ActiveX समाधान के लिए Adobe Reader woul आवश्यक है साथ ही, हाँ। लेकिन शेलेक्सक्यूट समाधान के बारे में आपकी क्या चिंताएं हैं? यह शायद सबसे सस्ता तरीका होगा ... – Leo

+0

बढ़िया! अपने उपयोग खंड में शैलएपी, विंडोज़ को जोड़ना याद रखें। – JoeGalind

7

यहाँ दिनचर्या का एक समूह मैं में लिखा है मेरी पुस्तकालय। यदि आप पर पैरामीटर के रूप में एक पीडीएफ फ़ाइल पास करते हैं तो प्रिंटिंगिंग यह प्रिंट करना चाहिए यदि एक्रोबैट रीडर प्रोग्राम स्थापित किया गया हो (यदि वे रजिस्ट्री में स्वयं पंजीकृत हैं तो अन्य पीडीएफ-सॉफ्टवेयर के साथ भी काम कर सकते हैं)।

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; 

नोट: यदि आपका डेल्फी संस्करण और ऑपरेटिंग सिस्टम पर इन बाहर की कोशिश करें (मैं उन्हें डेल्फी 7 के तहत विकसित किया और उन्हें Windows XP के अंतर्गत किया जाता है)।

यदि आप मूल प्रिंटिंग चाहते हैं (एक्रोबैट रीडर के बिना स्थापित - लेकिन जिन्होंने इन दिनों एक्रोबैट रीडर इंस्टॉल नहीं किया है?) आप निम्न घटक सेट पर विचार कर सकते हैं: Pdft print components from WpCubed

अद्यतन

अनुरोध करने पर मैं अपने पुस्तकालय से समारोह निष्पादित ...

+0

अच्छा। "निष्पादन" समारोह कहां से आता है? – neves

+0

@neves जैसा कि कहा गया है: यह डेल्फी रूटीन और कक्षाओं की विशाल पुस्तकालय से कोड है जो मैंने वर्षों से खुद को लिखा है। मैंने 'निष्पादन' कोड जोड़ा (जो कि आपके पास पहले से मौजूद कोड है)। – Edelcom

+0

@nevers, जब आप टिप्पणी करते हैं तो @ + edelcom जोड़ने के लिए मत भूलना ... अन्यथा मैं आपकी टिप्पणियां नहीं देख सकता (जब तक कि मैं स्पष्ट रूप से यह संदेश नहीं खोलता, जिसे मैंने अब आपके अपवर्त के कारण किया था)। – Edelcom

1

एक शेयरवेयर-prog 'AutoPrint' कहा जाता है कि एक प्रिंटर से एक फ़ोल्डर में सभी फ़ाइलें भेजता है, जोड़ा लागत 35 डॉलर। (यदि आपके पास कई ग्राहक नहीं हैं)।

अन्यथा यह अच्छा होगा अगर कोई ऐसा कोड ठीक कर सके जो ऐसा करता है।

+2

क्या आप प्रासंगिक प्रोग्राम को जोड़ने के लिए अपना उत्तर संपादित कर सकते हैं? क्या आप इसके उपयोग के बारे में कुछ जानकारी भी जोड़ सकते हैं और क्या यह इरादे से काम करता है? –

1

डेल्फी से एडोब रीडर का उपयोग किए बिना प्रिंटर को पीडीएफ प्रिंट करना Debenu Quick PDF Library का उपयोग करके किया जा सकता है, जो डेल्फी के सभी संस्करणों को 4 से XE8 तक समर्थन देता है।प्रोग्राम के रूप में एक पीडीएफ मुद्रण यह पूर्वावलोकन किए बिना के लिए नमूना कोड:

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; 

अधिक उन्नत मुद्रण विकल्प भी customer printer functions का उपयोग कर उपलब्ध हैं। यह एक मुफ्त एसडीके नहीं है, लेकिन यह वही करेगा जो आप चाहते हैं।

+0

या डेल्फी पीडीएफियम लाइब्रेरी का उपयोग करें – MartynA

संबंधित मुद्दे