PDFからPostScriptへの変換

以下のコードスニペットは、Aspose.PDF.Drawingライブラリとも連携します。

C#でPDFをポストスクリプトに変換

PdfViewerクラスはPDFドキュメントの印刷機能を提供し、このクラスを利用してPDFファイルをPostScript形式に変換することができます。PDFファイルをPostScriptに変換するには、まず任意のPSプリンタをインストールし、PdfViewerを使用してファイルに印刷します。ハワイ大学の指示に従ってPSプリンタをインストールする方法が記載されています。以下のコードスニペットは、PDFを印刷してPostScript形式に変換する方法を示しています。

public static void PrintToPostscriptFile()
{
    // ドキュメントディレクトリへのパス。
    // string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();

    Aspose.Pdf.Facades.PdfViewer viewer = new Aspose.Pdf.Facades.PdfViewer();
    viewer.BindPdf(_dataDir + "input.pdf");
    // PrinterSettingsとPageSettingsを設定
    System.Drawing.Printing.PrinterSettings printerSettings = new System.Drawing.Printing.PrinterSettings();
    printerSettings.Copies = 1;
    // PSプリンタを設定、このドライバーはWindowsにプリインストールされているプリンタードライバーのリストで見つけることができます
    printerSettings.PrinterName = "HP LaserJet 2300 Series PS";
    // 出力ファイル名とPrintToFile属性を設定
    printerSettings.PrintFileName = _dataDir + "PdfToPostScript_out.ps";
    printerSettings.PrintToFile = true;
    // 印刷ページダイアログを無効にする
    viewer.PrintPageDialog = false;
    // プリンタ設定オブジェクトをメソッドに渡す
    viewer.PrintDocumentWithSettings(printerSettings);
    viewer.Close();
}

印刷ジョブのステータスを確認する

PDFファイルは、印刷ダイアログを表示せずに、物理プリンターやMicrosoft XPS Document Writerに印刷することができます。これはPdfViewerクラスを使用して行います。大きなPDFファイルを印刷する場合、プロセスに時間がかかることがあるため、ユーザーは印刷プロセスが完了したか、問題に遭遇したかどうかがわからないことがあります。印刷ジョブのステータスを決定するには、PrintStatusプロパティを使用します。次のコードスニペットは、PDFファイルをXPSファイルに印刷し、印刷ステータスを取得する方法を示しています。

public static void CheckingPrintJobStatus()
{
    // For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
    // The path to the documents directory.
    // string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();

    // PdfViewerオブジェクトをインスタンス化
    PdfViewer viewer = new PdfViewer();

    // ソースPDFファイルをバインド
    viewer.BindPdf(_dataDir + "input.pdf");
    viewer.AutoResize = true;

    // 印刷ダイアログを非表示
    viewer.PrintPageDialog = false;

    // Printer Settingsオブジェクトを作成
    System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
    System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();

    // プリンター名を指定
    ps.PrinterName = "Microsoft XPS Document Writer";

    // 結果の印刷物名
    ps.PrintFileName = "ResultantPrintout.xps";

    // 出力をファイルに印刷
    ps.PrintToFile = true;
    ps.FromPage = 1;
    ps.ToPage = 2;
    ps.PrintRange = System.Drawing.Printing.PrintRange.SomePages;

    // 印刷物のページサイズを指定
    pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
    ps.DefaultPageSettings.PaperSize = pgs.PaperSize;
    pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);

    // 上記の設定でドキュメントを印刷
    viewer.PrintDocumentWithSettings(pgs, ps);

    // 印刷ステータスをチェック
    if (viewer.PrintStatus != null)
    {
        // 例外が投げられた
        if (viewer.PrintStatus is Exception ex)
        {
            // 例外メッセージを取得
            Console.WriteLine(ex.Message);
        }
    }
    else
    {
        // エラーは見つかりませんでした。印刷ジョブは正常に完了しました
        Console.WriteLine("printing completed without any issue..");
    }
}

印刷ジョブの所有者名の取得/設定

最近、印刷ジョブの所有者名(実際にWebページの印刷ボタンを押したユーザー)を取得/設定する要件を受けました。この情報はPDFファイルを印刷する際に必要です。この要件を達成するために、PrinterJobNameというプロパティを使用できます:

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.Pdf-for-.NET をご覧ください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();
PdfViewer viewer = new PdfViewer();
// ソースPDFファイルをバインド
viewer.BindPdf(dataDir + "input.pdf");
// 印刷ジョブの名前を指定
viewer.PrinterJobName = GetCurrentUserCredentials();
// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.Pdf-for-.NET をご覧ください。
private static string GetCurrentUserCredentials()
{
    // 実行中のアプリケーションのタイプ(ASP.NET、Windowsフォームなど)によって実装が異なります。
    string userCredentials = string.Empty;
    return userCredentials;
}

インパーソネーションの使用

印刷ジョブの所有者名を取得する別のアプローチは、インパーソネーション(別のユーザーコンテキストで印刷ルーチンを実行する)を使用することです。また、ユーザーはSetJobルーチンを使用して直接所有者名を変更することができます。

Aspose.PDFの印刷APIを使用して所有者値を設定することは、セキュリティ上の理由から不可能であることに注意してください。プロパティPrinterJobNameは、スプーラー印刷アプリケーションのドキュメント名列の値を設定するために使用できます。上に共有されたコードスニペットは、ユーザーがドキュメント名列にユーザー名を組み込む方法を示しています(例えばUserName\documentNameの構文を使用して)。しかし、所有者列の設定は次の方法でユーザーによって直接実装できます:

  1. インパーソネーション。所有者列の値には印刷コードを実行するユーザーの値が含まれているため、別のユーザーコンテキスト内でAspose.PDF印刷APIを呼び出す方法があります。例として、ここに説明されているソリューションをご覧ください。このクラスを使用することで、ユーザーは目標を達成できます:
// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.Pdf-for-.NET をご覧ください
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();
PdfViewer viewer = new PdfViewer();
viewer.BindPdf(dataDir + "input.pdf");
viewer.PrintPageDialog = false;
// 印刷時にページ番号ダイアログを生成しない
using (new Impersonator("OwnerUserName", "SomeDomain", "OwnerUserNamePassword"))
{
    System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
    ps.PrinterName = "Microsoft XPS Document Writer";
    viewer.PrintDocumentWithSettings(ps); // OwnerUserNameはスプーラーアプリのOwner列の値です
    viewer.Close();
}
  1. Spooler APIとSetJobルーチンの使用

以下のコードスニペットは、PDFファイルの一部のページをシンプレックスモード、一部のページをデュプレックスモードで印刷する方法を示しています。

struct PrintingJobSettings
{
    public int ToPage { get; set; }
    public int FromPage { get; set; }
    public string OutputFile { get; set; }
    public System.Drawing.Printing.Duplex Mode { get; set; }
}
// 完全な例やデータファイルについては、https://github.com/aspose-pdf/Aspose.Pdf-for-.NET をご覧ください。
// 文書ディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();

int printingJobIndex = 0;
string inPdf = dataDir + "input.pdf";
string output = dataDir;
IList<PrintingJobSettings> printingJobs = new List<PrintingJobSettings>();

PrintingJobSettings printingJob1 = new PrintingJobSettings();
printingJob1.FromPage = 1;
printingJob1.ToPage = 3;
printingJob1.OutputFile = output + "35925_1_3.xps";
printingJob1.Mode = Duplex.Default;

printingJobs.Add(printingJob1);

PrintingJobSettings printingJob2 = new PrintingJobSettings();
printingJob2.FromPage = 4;
printingJob2.ToPage = 6;
printingJob2.OutputFile = output + "35925_4_6.xps";
printingJob2.Mode = Duplex.Simplex;

printingJobs.Add(printingJob2);

PrintingJobSettings printingJob3 = new PrintingJobSettings();
printingJob3.FromPage = 7;
printingJob3.ToPage = 7;
printingJob3.OutputFile = output + "35925_7.xps";
printingJob3.Mode = Duplex.Default;

printingJobs.Add(printingJob3);

PdfViewer viewer = new PdfViewer();

viewer.BindPdf(inPdf);
viewer.AutoResize = true;
viewer.AutoRotate = true;
viewer.PrintPageDialog = false;

PrinterSettings ps = new PrinterSettings();
PageSettings pgs = new PageSettings();

ps.PrinterName = "Microsoft XPS Document Writer";
ps.PrintFileName = Path.GetFullPath(printingJobs[printingJobIndex].OutputFile);
ps.PrintToFile = true;
ps.FromPage = printingJobs[printingJobIndex].FromPage;
ps.ToPage = printingJobs[printingJobIndex].ToPage;
ps.Duplex = printingJobs[printingJobIndex].Mode;
ps.PrintRange = PrintRange.SomePages;

pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
ps.DefaultPageSettings.PaperSize = pgs.PaperSize;
pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
viewer.EndPrint += (sender, args) =>
{
    if (++printingJobIndex < printingJobs.Count)
    {
        ps.PrintFileName = Path.GetFullPath(printingJobs[printingJobIndex].OutputFile);
        ps.FromPage = printingJobs[printingJobIndex].FromPage;
        ps.ToPage = printingJobs[printingJobIndex].ToPage;
        ps.Duplex = printingJobs[printingJobIndex].Mode;
        viewer.PrintDocumentWithSettings(pgs, ps);
    }
};

viewer.PrintDocumentWithSettings(pgs, ps);