Avatar billede tigerdyr2007 Praktikant
27. december 2009 - 17:44 Der er 7 kommentarer og
1 løsning

printe eksisterende PDF

Hvad er syntaksen for at printe en eksisterende .PDF-fil fra VBA? ala:

take file_name and send to default printer, and let press 'print'.
Avatar billede mugs Novice
28. december 2009 - 08:57 #1
Er der virkelig ikke noget her der kan genbruges:

http://www.eksperten.dk/search?category=33&q=pdf
Avatar billede tigerdyr2007 Praktikant
28. december 2009 - 11:04 #2
Sikkert, har pløjet lidt frem og tilbage, men synes ikke jeg lige finder det rigtige.
Har prøvet med:

Dim full_file_name As String
Dim file_name As String

file_name = DLookup("[file_name]", "tbl_invoice", "[ID] = " & invoice_ID)
full_file_name = CurrentProject.path & "\Faktura\" & fil_ename

Dim aPDF As AcroPDF
Set aPDF = New AcroPDF
aPDF.LoadFile (full_file_name)
aPDF.printAll

Som ikke virker, bruger nu:
DoEvents
test = Shell(acroreader_path & " /p /h " & full_file_name, vbHide)

det virker, men jeg kan ikke få lukket det åbne acrobat reader vindue nu. nogen bud? Gerne en konkret kommando, og ikke et søgeord på eksperten.
Avatar billede Slettet bruger
28. december 2009 - 11:49 #3
i explorer context menuen på mit system kaldes den excuteable (foxit reader) blot med /p option for udskriv - dette er registry værdien:
"C:\PROGRA~1\FOXITS~1\FOXITR~1\FOXITR~1.EXE" /p "%1"
Avatar billede tigerdyr2007 Praktikant
28. december 2009 - 12:12 #4
Det er også hvad jeg selv har fundet:
test = Shell(acroreader_path & " /p /h " & full_file_name, vbHide)

Nu mangler jeg bare at kunne lukke acroread igen, og den har så "shell_ID" = test... Nogen bud der?
Avatar billede Slettet bruger
28. december 2009 - 13:12 #5
NU gjorde jeg det for din skyld - lavede en rigtig papir udskift fra explorer kontekst menupunktet og på mit system ser jeg intet vindue eller blivende processer. Det er foxit reader 2.3
Jeg ved ikke om måden shell åbner på betyder noget - det der med windows handle og vbHide - nogen gange, i andre sammenhænge har jeg eksperimenteret med:

cmd /c start executeable arguments
----------------------------------
- der er nogle forståelsefælder i det  - husk ["titel"] (som i ikke er så optionel som syntaksen lader ane - men blot kan være "") og så gåseøjne de rette steder.

kill
----
Et andet (virkeligt) workaround er kill (ikke vba 'kill' fil tingen!) - sådan noget banker jeg sammen i c++ men da vba har adgang til hele windows api'et kan det selvfølgeligt også laves i vba.

java
----
Hvis man har sådan noget development noget på sit system', tror jeg det er en lille ting at lave noget der kan udskive vha. en jar executeable - involverer ikke proprietære readere. Hvis alt andet glipper så kan jeg måske lokkes til at lave sådan en dims (java 5 eller 6)

-----
Selvom det er et tåbeligt workaround, kommer her for fuldstændighedens skyld, til  belysning af hvilke api kald der skal søges efter, c++ koden til kill:

// Kill_Process.cpp : compiles in Borland c++ 5.5

#include <iostream>
#include <windows.h>
#include <Tlhelp32.h>


using namespace std;

int main(int argc, TCHAR* argv[])
{
        if (argc < 2 ) {
            cout << "Syntax: Kill `process1.exe` [`process1.exe`]..." << endl;
            exit(0); }
       
       
       
       
        HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if (hndl == INVALID_HANDLE_VALUE) {
            cout << "CreateToolhelp32Snapshot() failed" << endl;
            exit(-1);
        } else {
       
        DWORD dwExitCode = 0;

        PROCESSENTRY32  procEntry={0};
        procEntry.dwSize = sizeof( PROCESSENTRY32 );
        Process32First(hndl,&procEntry);
        do
        {
                for (int i=argc;i > 1; --i)
                    if(!strcmpi(procEntry.szExeFile,argv[i-1]))
                    {
                        HANDLE hHandle;
                        hHandle = ::OpenProcess(PROCESS_ALL_ACCESS,0,procEntry.th32ProcessID);
               
                        ::GetExitCodeProcess(hHandle,&dwExitCode);
                        ::TerminateProcess(hHandle,dwExitCode);   
                        cout << procEntry.szExeFile << " killed." << endl;
                       
                    }
            //cout<<"Running Process "<<"          "<<procEntry.szExeFile<<endl;
        } while(Process32Next(hndl,&procEntry));
    }
       
    return 0;
}
Avatar billede tigerdyr2007 Praktikant
28. december 2009 - 15:47 #6
Se der fik du mig så. Jeg værdsætter dit lange svar, men min acroreader lukker desværre ikke ned bagefter :-(

Vil give
cmd /c start executeable arguments
et forsøg
Avatar billede tigerdyr2007 Praktikant
28. december 2009 - 16:44 #7
Access genkender slet ikke cmd /c, er det noget jeg mangler at tilføje?
Jeg føler mig lidt klumpet, mener det burde være ret simpelt at printe en eksisterende PDF fra VBA, men...
Avatar billede Slettet bruger
28. december 2009 - 20:46 #8
cmd.exe er konsol kommandofortolkeren - hvis ikke den ligger i en mappe der er med i mappelisten der angives af environment variablen PATH, skal stien skrives fuldt ud - på mit system 'ligger den' i path'en og dens fulde stinavn er c:\windows\system32\cmd.exe.
Prøv at åbne et consol vindue: startmenuen->kør->cmd. Prøv, i consol vinduet at skrive: help start - her ses syntaksen for den i cmd.exe  indbyggede kommando: start.
Prøv også at skrive 'help cmd' - men tab ikke helt pusten ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester