Microsoft Windows 10 wordt geleverd met een Microsoft Print To PDF-printer die iets naar een PDF-bestand kan afdrukken. Het vraagt om de bestandsnaam om te downloaden.
Hoe kan ik dit programmatisch regelen vanuit C#, zodat ik niet om de PDF-bestandsnaam vraag, maar naar een specifieke bestandsnaam in een map die ik opgeef?
Dit is voor batchverwerking van het programmatisch afdrukken van een groot aantal documenten of andere soorten bestanden naar een PDF.
Antwoord 1, autoriteit 100%
Als u een PrintDocument
-object wilt afdrukken met de Microsoft Print to PDF-printer zonder te vragen om een bestandsnaam, volgt hier de pure codemanier om dit te doen:
// generate a file name as the current date/time in unix timestamp format
string file = (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();
U kunt deze methode ook gebruiken voor andere printers van het type Opslaan als bestand, zoals Microsoft XPS-printer
Antwoord 2
U kunt afdrukken naar de Windows 10 PDF-printer door de methode PrintOut
te gebruiken en de vierde parameter voor de naam van het uitvoerbestand op te geven, zoals in het volgende voorbeeld:
/// <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
);
}
Het OutputFile
is een volledige padtekenreeks van het invoerdocument dat u wilt converteren, en het document is een gewoon documentobject. Voor meer informatie over het document, zie de volgende MSDN-links voor _Document.PrintOut()
De PrintOut
in het voorbeeld resulteert in een stille afdruk, wanneer u afdrukt via het opgegeven inputFile
naar de OutputFileName
, die in dezelfde map als het originele document, maar in PDF-formaat met de extensie .pdf
.