2015-08-08 20 views
26

Microsoft Windows 10 viene fornito con una stampante Microsoft Print To PDF che può stampare qualcosa su un file PDF. Richiede il nome del file da scaricare.Come stampare a livello di codice in PDF senza richiedere il nome file in C# utilizzando la stampante Microsoft Print To PDF fornita con Windows 10

Come posso controllare a livello di codice questo da C# per non richiedere il nome file PDF, ma salvare in un nome file specifico in qualche cartella che fornisco?

Questo è per l'elaborazione in batch della stampa di un sacco di documenti o altri tipi di file in un PDF a livello di programmazione.

+0

ha pubblicato una soluzione di lavoro per te. fatemi sapere cosa ne pensate :) –

+1

Quanto sarebbe semplice e immenso, se tale tipo di opzione (funzione di nome automatico) venisse fornita da Microsoft nel proprio software. –

risposta

1

È possibile stampare sulla stampante di Windows 10 PDF, utilizzando il metodo PrintOut e specificando il quarto parametro nome del file di output, come nel seguente esempio:

/// <summary> 
/// Convert a file to PDF using office _Document object 
/// </summary> 
/// <param name="InputFile">Full path and filename with extension of the file you want to convert from</param> 
/// <returns></returns> 
public void PrintFile(string InputFile) 
{ 
    // convert input filename to new pdf name 
    object OutputFileName = Path.Combine(
     Path.GetDirectoryName(InputFile), 
     Path.GetFileNameWithoutExtension(InputFile)+".pdf" 
    ); 


    // Set an object so there is less typing for values not needed 
    object missing = System.Reflection.Missing.Value; 

    // `doc` is of type `_Document` 
    doc.PrintOut(
     ref missing, // Background 
     ref missing, // Append 
     ref missing, // Range 
     OutputFileName, // OutputFileName 
     ref missing, // From 
     ref missing, // To 
     ref missing, // Item 
     ref missing, // Copies 
     ref missing, // Pages 
     ref missing, // PageType 
     ref missing, // PrintToFile 
     ref missing, // Collate 
     ref missing, // ActivePrinterMacGX 
     ref missing, // ManualDuplexPrint 
     ref missing, // PrintZoomColumn 
     ref missing, // PrintZoomRow 
     ref missing, // PrintZoomPaperWidth 
     ref missing, // PrintZoomPaperHeight 
    ); 
} 

Il OutputFile è una stringa di percorso completo del documento di input che si desidera convertire e il documento è un oggetto documento normale. Per maggiori informazioni sul doc vedere i seguenti collegamenti MSDN per _Document.PrintOut()

Il PrintOut nell'esempio risultati una stampa silenziosa, quando si stampa attraverso il specificato inputFile al OutputFileName, che verrà inserito nella stessa cartella del documento originale, ma sarà in formato PDF con l'estensione .pdf.

+2

Non c'è alcuna indicazione nella domanda che il poster stia utilizzando un prodotto Office. –

+0

@KenWhite, è stato solo attraverso la ricerca e il link originale che ho scoperto. Aggiornato aggiungendo il collegamento corrente e riformattando parte del codice in modo che sia prontamente compreso senza dover accedere al/ai collegamento/i. i collegamenti sono forniti solo come riferimento. –

+2

@SanuelJackson: Non ho detto nulla sui link o sulla tua modifica. Il mio punto è che questa intera risposta si basa sulla premessa che l'OP sta usando Word o Excel o automazione, e non vi è alcuna indicazione nella domanda che sia così. –

24

Per stampare un oggetto PrintDocument utilizzando il stampa Microsoft al PDF stampante senza richiedere un nome di file, qui è il modo puro codice per fare questo:

// generate a file name as the current date/time in unix timestamp format 
string file = (string)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds.ToString(); 

// the directory to store the output. 
string directory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 

// initialize PrintDocument object 
PrintDocument doc = new PrintDocument() { 
    PrinterSettings = new PrinterSettings() { 
     // set the printer to 'Microsoft Print to PDF' 
     PrinterName = "Microsoft Print to PDF", 

     // tell the object this document will print to file 
     PrintToFile = true, 

     // set the filename to whatever you like (full path) 
     PrintFileName = Path.Combine(directory, file + ".pdf"), 
    } 
}; 

doc.Print(); 

È inoltre possibile utilizzare questo metodo per altri Salva come file Metodi tipo come Stampante Microsoft XPS

+2

Come posso usarlo per stampare nuovamente un PDF esistente con Microsoft Print To PDF, ad es. per "cuocere" le annotazioni all'interno del PDF? – clocktown

+0

Qualcosa di simile può essere fatto con ** Visual C++ **? –

+0

@AndrewTruckle - Il principio sarebbe lo stesso.Selezionare la stampante virtuale PDF, quindi stamparla normalmente, anche se immagino che in C++ ci siano probabilmente modi migliori per ottenere lo stesso compito. Mentre il codice sopra funziona, lo trovo piuttosto lento. –

Problemi correlati