Condividi:        

Stampare file pdf

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Stampare file pdf

Postdi panix76 » 05/07/12 09:52

Buongiorno,
avrei bisogno di un aiuto. ho necessità di stampare un file pdf da macro excel. quello che devo fare è, dato il path ed il nome del file pdf da stampare, la possibilità di impostare da macro l'intervallo di pagine da stampare. grazie.
panix76
Utente Junior
 
Post: 10
Iscritto il: 05/07/12 09:46

Sponsor
 

Re: Stampare file pdf

Postdi Flash30005 » 06/07/12 12:38

Ciao Panix76 e benvenuto nel Forum

L'argomento è stato trattato più volte
hai provato a fare una ricerca prima di porre il quesito?

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Stampare file pdf

Postdi Anthony47 » 07/07/12 02:13

Ciao Panix76, benvenuto anche da parte mia.

No Flash, non ricordo che l' argomento sia gia' stato affrontato...

Nel merito della domanda, esiste la libreria "Adobe Acrobat Browser Control Type Library", applicabile anche alla versione free di Adobe Reader, che secondo la documentazione dovrebbe consentire di far riferimento a un file pdf e stampare un range di pagine.
La documentazione di riferimento e'
-Developing for Adobe Reader
-Developing Applications Using Interapplication Communicationication
-Acrobat Interapplication Communication Reference
tutta disponibile dal sito Adobe.com

Quello che ho capito mi ha portato a questo semplice codice:
Codice: Seleziona tutto
Sub ppp()
Dim AdReader As Object
myFName = "C:\Documents and Settings\USER\My Documents\Documento.pdf"
Set AdReader = CreateObject("AcroPDF.PDF") '.1")
AdReader.LoadFile(myFName)
'myERR = AdReader.printAll
myErr = AdReader.PrintPages(2, 3)
End Sub

Semplice ma inutile, infatti il codice non produce nessun effetto, ne' usando printAll ne' usando PrintPages(2,3).
Dopo vari tentativi ho abbandonato ignominosamente; se qualcun altro volesse provare...

Ciao a tutti
Avatar utente
Anthony47
Moderatore
 
Post: 19217
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Stampare file pdf

Postdi Flash30005 » 08/07/12 03:38

EDIT: Forse ho interpretato male il quesito intendendo la stampa su file pdf di fogli di excel
Avendo, ormai realizzato un elaborato per ottenere un file pdf di tutti i fogli contenuti in una cartella di excel la metto a disposizione per chi ha questa esigenza.


Per realizzare un unico file .pdf da diversi fogli di una cartella di excel occorre una utility (senza installazione) che allegherò in questo post.
La seguente macro crea i singoli file e poi avvia l'utility che unisce in un unico file pdf i file singoli precedentemente creati
Codice: Seleziona tutto
Public PercFE, NFileE, STrD, STrDTesta, STrDCoda As String
Sub SalvaPdf()
Call macroPrintPDF1(PercF & "\", NFile)
End Sub
Private Function macroPrintPDF1(ByVal PercF As String, ByVal NFile As String)
Dim objPDFCreator  '<<<  Late Bind
StPdf = Shell("RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n " & """PDFCreator""")
For NF = 1 To Worksheets.Count
Nfoglio = Sheets(NF).Name
NFile = Nfoglio & ".pdf"
Perc = ThisWorkbook.Path & "\"
PercF = Perc
PercFE = PercF
NFileE = NFile
'On Error Resume Next
    If Dir(PercF & NFile) = NFile Then Kill (PercF & NFile)
'On Error GoTo 0

If IsProcessRunning("PDFCreator.exe") Then
    Shell "taskkill /f /im PDFCreator.exe", vbHide
End If

azz = Timer
Do
    If Not IsProcessRunning("PDFCreator.exe") Then Exit Do
    DoEvents
    If Timer > (azz + 30) Or (Timer < azz And Timer > 25) Then
        MsgBox ("Non e' stato possibile chiudere PDFCreator; processo abortito")
        Exit Function
    End If
Loop

Application.Wait (Now + TimeValue("0:00:02"))

Set objPDFCreator = CreateObject("PDFCreator.clsPDFCreator")
aaa1 = objPDFCreator.cProgramIsRunning

With objPDFCreator
.cStart "/NoProcessingAtStartup"
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = PercF
.cOption("AutosaveFilename") = NFile
.cOption("AutosaveFormat") = 0
aaa = .cOption("AutosaveFilename")
.cVisible = False
.cClearCache
End With

ActiveSheet.PrintOut Copies:=1, ActivePrinter:="PDFCreator"   'stampa "Foglio"

objPDFCreator.cPrinterStop = False

Do
   DoEvents
Loop Until Dir(PercF & NFile) = NFile

Next NF
Set objPDFCreator = Nothing
Shell "taskkill /f /im PDFCreator.exe", vbHide
'StDef = Shell("C:\PrintDefault.bat")
Application.Wait (Now + TimeValue("0:00:03"))
sFile = ""
For NF = 1 To Worksheets.Count
If NF = 1 Then
sFile = Sheets(NF).Name & ".pdf"
Else
sFile = sFile & " " & Sheets(NF).Name & ".pdf"
End If
Next NF

    sOutput = "MergeFile.pdf"
   
    Open Perc & "temp.bat" For Output As #1
    Print #1, "cd " & Perc
    Print #1, "pdftk " & sFile & " cat output " & sOutput
    Close #1
    Application.Wait (Now + TimeValue("0:00:05"))
    abc = Shell(Perc & "temp.bat")


End Function
Private Function IsProcessRunning(ByVal ProcName As String) As Boolean
    Dim objWMIService, objProcess, colProcess
    Dim strComputer, strList
'
    strComputer = "."
'
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
   
    Set colProcess = objWMIService.ExecQuery _
    ("Select * from Win32_Process")
   
    For Each objProcess In colProcess
        If CBool(InStr(1, objProcess.Name, ProcName, vbTextCompare)) Then
            IsProcessRunning = True
            Exit Function
        End If
    Next
End Function

Salva questo file.xls in una cartella del disco

poi scarica questa utility
download utility
Scomptta il file allegato
nella cartella bin troverai due file (un exe e una dll)
ambedue i file dovranno essere inseriti nella cartella c:\Windows\System32
(in windowsXp o C:\Windows\WOW64\ in windows 7)
poi avvia la macro
Si creeranno tanti file pdf quanti sono i fogli della cartella
alla fine verranno uniti dal file Temp.bat
Volendo è possibile eliminare in automatico sia i singoli file.pdf sia il file .bat e lasciare solo il file MergeFile.pdf
Ciao

N.b. Chiaramente nel Pc deve essere installato PdfCreator che è free
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Stampare file pdf

Postdi wallysimpsons » 08/07/12 11:43

Ciao Panix

Per stampare un file PDF già esistente potresti sfruttare la funzione ShellExecute, però non mi è mai capitato di dover impostare il numero di pagine :roll:


Codice: Seleziona tutto
Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub stampa()

On Error Resume Next
Dim X As Long
X = ShellExecute(0, "Print", "C:\file.pdf", "", "", 1)

End Sub
Wally (Excel 2007)
Avatar utente
wallysimpsons
Utente Junior
 
Post: 11
Iscritto il: 25/11/09 14:09

Re: Stampare file pdf

Postdi wallysimpsons » 08/07/12 15:17

Ciao

n questo modo è possibile aprire il file ad una determinata pagina ma non so se è applicabile anche alla stampa

Codice: Seleziona tutto
Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub stampa()

Dim X As Long
    Dim strPath, strParam As String

On Error Resume Next
   
    strPath = "C:\File.pdf"
    strParam = " /A " & Chr(34) & "page=4" & Chr(34) & strPath
     
    X = ShellExecute(0, "Open", "AcroRd32.exe", strParam, "", 1)

End Sub
Wally (Excel 2007)
Avatar utente
wallysimpsons
Utente Junior
 
Post: 11
Iscritto il: 25/11/09 14:09

Re: Stampare file pdf

Postdi Flash30005 » 09/07/12 01:05

Se l'esigenza è quella di stampare solo alcune pagine di un file pdf
è possibile, utilizzando l'utility precedente, creare dapprima un file .pdf con le sole pagine da stampare e poi stamparle
la macro quindi sarà più o meno così:
Codice: Seleziona tutto
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Const SW_NORMAL = 1
Public Perc As String
Sub StampaPagPdf()
sFile1 = "NomeFile.pdf"  '<<<<< inserire nome corretto file originale
PagS = "1-5"                  '<<<<< inserire il range delle pagine in questo caso da 1 a 5
sOutput = "FileStampa.pdf"   '<<<<<<<<<<< file temporaneo che può essere cancellato dopo il processo di stampa
Perc = ThisWorkbook.Path & "\"
    Open Perc & "temp.bat" For Output As #1
    Print #1, "cd " & Perc
    Print #1, "pdftk A=" & sFile1 & " cat A" & PagS & " output " & sOutput
    Close #1
    Application.Wait (Now + TimeValue("0:00:05"))
    abc = Shell(Perc & "temp.bat")
    Application.Wait (Now + TimeValue("0:00:05"))
Call ShellExecute(0, "Print", Perc & sOutput, "", "", 0)

End Sub


Dopo aver incollato la macro in un modulo,
salvare il file nella stessa cartella del file Pdf originale
Avviare la macro (con stampante accesa).

E' possibile, anche creare un unico filestampa.pdf combinando pagine di diversi file pdf
e, quindi stampare

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Stampare file pdf

Postdi panix76 » 09/07/12 16:51

ringrazio calorosamente tutti.
di tutte le risposte l'ultima mi sembra quella che risponde al mio problema.
Spiego meglio le mie necessità così da non creare confusione. Ho realizzato una macro che genera delle pagine excel ogni volta che viene lanciata, quindi salva queste pagine in un unico file pdf. Ogni file pdf viene salvato in una cartella con il giorno, mese, anno del momento in cui viene lanciata (formato gg_mm_aaaa). Quindi viene anche creato un record su un database. Ogni file pdf ha un nome (identico) ed un progressivo (univoco)e può contenere da 1 a più di 500 pagine. Ovviamente il primo file di ogni giorno ha come progressivo l'1. Spero di essere stato chiaro fino a qui.
Successivamente può succedere che sia necessario ristampare solo alcune pagine di un determinato file pdf. Tramite macro e DB riesco a ricercare perfettamente il file che contiene la pagina/le pagine che mi interessa/interessano, ma vorrei poter stampare solo quella pagina/quelle pagine e non tutto il file. A questo punto mi si aprono 2 strade:

- o provo a stampare solo quella/quelle pagine che mi interessano
- o salvo sempre, oltre al file pdf, anche il file excel (a quel punto poi ricreo un file pdf con le sole pagine che mi interessano)

La seconda scelta però mi occupa, ovviamente, notevolmente più spazio.

Come detto proverò l'ultima soluzione e vi farò sapere, ringrazio davvero tutti
panix76
Utente Junior
 
Post: 10
Iscritto il: 05/07/12 09:46

Re: Stampare file pdf

Postdi Flash30005 » 09/07/12 19:25

Se hai fatto da solo il programma da te descritto non ti sarà difficile assegnare alla macro precedente le variabili:
PagS = "1-5" 'il valore, in formato testo (con doppi apici), di una cella es.: Range("H1").value (oppure al valore che, forse, avrai a fianco del nome file (come pagine predefinite di ristampa)
e
sFile1 = "NomeFile.pdf" '<<<<< un click di mouse su un elenco che mi sembra tu abbia

Il codice di stampa pagine si riferisce ad un range di pagine contigue (nell'esempio dalla pagina 1 alla pagina 5)
Fai sapere nel caso avessi bisogno di stampare pagine non contigue (es.: pagina 1, pagina 5, pagina 10 etc)

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Stampare file pdf

Postdi panix76 » 10/07/12 11:36

Perfetto,
tutto funziona, per completezza aggiungo solo che, ovviamente bisogna scaricare pdftk.exe e metterlo nella stessa cartella di esecuzione del .bat
inoltre se si volessero stampare più intervalli mi sembra che la sintassi corretta sia:
invece di: PagS = "1-5" (stampa un file pdf con le pagine dalla 1 alla 5)
inserire: PagS = "1-5 A7-10 A12" (stampa un file pdf con le pagine dalla 1 alla 5, quindi dalla 7 alla 10, quindi la 12)

A questo punto direi che la procedura che potrei implementare è la seguente:

una volta individuato il file pdf da stampare, il path e l'intervallo di pagine:

1) Creare i file temp.bat e FileStampa.pdf con le sole pagine da stampare con la sub sopra descritta
2) Stampare il file FileStampa.pdf così creato
3) Eliminare sia temp.bat che FileStampa.pdf

Grazie davvero
Ultima modifica di panix76 su 10/07/12 11:48, modificato 1 volte in totale.
panix76
Utente Junior
 
Post: 10
Iscritto il: 05/07/12 09:46

Re: Stampare file pdf

Postdi Flash30005 » 10/07/12 11:46

panix76 ha scritto:Mi rimane solo da capire come eseguire da macro il file temp.bat


:?:

La macro del 9 u.s. ore 02:05 fa tutto quello che dici ad esclusione dell'eliminazione del file (che reputo superflua in quanto viene sovrascritto ogni volta sia il temp.bat che Filestampa.pdf)

Mi viene, quindi, il dubbio che non abbia provato la macro postata :roll:

ciao

P.s. quale sistema operativo hai?
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Stampare file pdf

Postdi panix76 » 10/07/12 11:49

Si, hai ragione, infatti ho subito corretto il post di prima.
Mi sembrava non eseguisse il comando, invece si, perfetto.
In effetti non è necessario neanche eliminare i file tanto li sovrascrive.
Grazie

P.S. SO XP pro
panix76
Utente Junior
 
Post: 10
Iscritto il: 05/07/12 09:46

Re: Stampare file pdf

Postdi panix76 » 10/07/12 14:59

Chiedo venia,
con ShellExecute(0, "Print", path_file_stampare, "", "", 0) invio la stampa del file pdf, ma mi stampa sulla stampante predefinita. se invece volessi scegliere la stampante con cui stampare??
Ho provato modificando Application.ActivePrinter, ma comunque stampa sulla predefinita.
E' possibile farlo?
grazie ancora
panix76
Utente Junior
 
Post: 10
Iscritto il: 05/07/12 09:46

Re: Stampare file pdf

Postdi Flash30005 » 11/07/12 11:39

prova con questo codice
Codice: Seleziona tutto
Application.Dialogs(xlDialogPrint).Show

dovrebbe permetterti di selezionare la stampante e aggiungendo il rispettivo "argument" la puoi far diventare predefinita per poi ripristinare la stampante iniziale
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Stampare file pdf

Postdi panix76 » 11/07/12 11:52

Mi rispondo da solo.
E' possibile cambiare da macro la stampante di default in questo modo:

Codice: Seleziona tutto
Sub cambia_print()

     Dim strDefaultPrinter  As String
     Dim objPrinter         As Object
   
     ' get current default printer.
     'strDefaultPrinter = Application.Printer.DeviceName
   
     Set objPrinter = CreateObject("WScript.Network")
     ' switch to printer of your choice:
     
      objPrinter.SetDefaultPrinter ("nome_nuova_stampante_di_default")
   
     ' swtich back
     'objPrinter.SetDefaultPrinter (strDefaultPrinter)


End Sub


La macro preleva la stampante di defalut, cambia questa stampante, quindi ripristina la stampante di default.
A me non funziona solo la riga: 'strDefaultPrinter = Application.Printer.DeviceName, per il resto è ok

Ciao

EDIT Flash - è opportuno usare sempre il tag CODE dell'editor quando si postano gli script di macro
panix76
Utente Junior
 
Post: 10
Iscritto il: 05/07/12 09:46

Re: Stampare file pdf

Postdi Flash30005 » 11/07/12 13:12

Prova questa
Codice: Seleziona tutto
Sub CambiaStampante()
Dim strPrinterOld As String
Set objPrinter = CreateObject("WScript.Network")
strPrinterOld = Application.ActivePrinter
strPrinterOld = Replace(strPrinterOld, " su Ne00:", "")

'cambia la stampante predefinita
objPrinter.SetDefaultPrinter "NuovaStampante"
'...
'...
'...
'alla fine resettare alla stampante predefinita originale
objPrinter.SetDefaultPrinter strPrinterOld


End Sub


Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Stampare file pdf

Postdi panix76 » 11/07/12 13:20

Ok, perfetto, funziona, io me l'ero cavata con un più complesso:

Codice: Seleziona tutto
strDefaultPrinter = Application.ActivePrinter
     pos = InStrRev(strDefaultPrinter, "su")
     strDefaultPrinter = Mid(strDefaultPrinter, 1, (pos - 2))


ma il tuo è meglio, fermo restando, immagino, che la stampante di default ha sempre Ne00, giusto?

Ne approfitto ancora, ho letto che gestendo

Codice: Seleziona tutto
ShellExecute(0, "Print", file_stampare, "", "", 0)


dove file_stampare è un pdf, è possibile impostare la stampa di più di una copia, qualcuno di voi sa dirmi come?

grazie ancora, utilissimi
panix76
Utente Junior
 
Post: 10
Iscritto il: 05/07/12 09:46

Re: Stampare file pdf

Postdi Flash30005 » 11/07/12 15:01

Non conoscendo la sintassi di più copie con quel codice potresti usare
Codice: Seleziona tutto
Copie = 5  '<<<<< può essere anche il valore di una cella di excel   ;-)
For NC = 1 to Copie
ShellExecute(0, "Print", file_stampare, "", "", 0)
Next NC


Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Stampare file pdf

Postdi panix76 » 11/07/12 15:35

per completezza posto quella che mi sembra essere la soluzione all'ultima domanda. Al link: http://www.vbforums.com/showthread.php?t=494671 ho trovate il listato che imposta il numero di copie (argomento copies passato alla Sub). L'ho provato funziona, ho solo sostituito al posto di VB.Printer.DeviceName il nome della stampante desiderata.

Quindi prima eseguo questa Sub poi eseguo
Codice: Seleziona tutto
Call ShellExecute(0, "Print", file_stampare, "", "", 0)
e tutto funziona

grazie
panix76
Utente Junior
 
Post: 10
Iscritto il: 05/07/12 09:46

Re: Stampare file pdf

Postdi Flash30005 » 11/07/12 23:12

panix76 ha scritto: L'ho provato funziona, ho solo sostituito al posto di VB.Printer.DeviceName il nome della stampante desiderata.

Potresti postare lo script usato?
:roll:
137 righe di codice? :eeh:
Se così, preferisco il mio For... next :D

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Stampare file pdf":


Chi c’è in linea

Visitano il forum: Nessuno e 34 ospiti