none
印刷時の縮小設定が利かない(PageScalingFactor) RRS feed

  • 質問

  • UserPrintTicket.PageScalingFactor を使用し、縮小印刷を試みましたが、縮小されません。

    PageScalingFactor は使用できないのでしょうか?

       defaultPrintQueue.UserPrintTicket.PageScalingFactor = 70;

    部数や

       defaultPrintQueue.UserPrintTicket.CopyCount = 1;

    印刷時の向き(回転)

       defaultPrintQueue.UserPrintTicket.PageOrientation = System.Printing.PageOrientation.Landscape;

    は利きました。

    環境

    ・.NET FrameWork4.5

    ・言語:c#

    ・印刷ファイルのフォーマット:XPS

    2013年1月9日 10:08

回答

  • ご確認、ありがとうございます。

    質問者さんが実現したいことは以下ののようなことですか?

    ■標準状態(normal.xps)

    normal.xps

    ■縮小状態(small.xps)

    small.xps

     

    このサイト(※1)を参考にして、ここ(※2)からサンプルプロジェクトをダウンロードし、それを少しいじりました。

    私は「PerformTransform」関数の中をいじって、上記のような縮小状態で印刷できることを確認しました。

    それ以外にも、※1のサイトで取り上げている「AdjustFlowDocumentToPage」関数を確認してみるなど、質問者さんが実現したいことに関しての調査のヒントになるようでしたら、是非ご利用ください。

     

    ■参考サイト

    ※1:Scaling XPS documents to fit within printable area

    ※2:XPS ドキュメントの印刷


    • 回答としてマーク t-shino 2013年1月21日 0:15
    2013年1月11日 13:02

すべての返信

  • こちらの方法が参考になりますでしょうか?

    PrintTicket.PageScalingFactor プロパティ

    こちらの「PageScalingFactor プロパティを設定する場合」をご確認ください。

    (PageScaling機能がCustomSquareに設定されている必要があるようです)
    • 編集済み kyk_nk 2013年1月9日 11:52 修正
    2013年1月9日 11:49
  • 回答ありがとうございます。

    MSDNですよね。記述を忘れておりましたが、こちらも既に参照済みです。

    以下、サイトから抜粋。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    PageScaling 機能が CustomSquare に設定され、CustomSquare オプションの Scale 値が渡された値に設定されます </sentencetext>例外」を参照してください)</sentencetext>

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    私としては、

    defaultPrintQueue.UserPrintTicket.PageScalingFactor = 70;

    と記述すれば、CustomSquareに値が設定される(正しくは、CustomSquareオプションのScale値に値が設定される)と解釈しております。

    ただ、結局上記で設定されていない(縮小設定が利かない)ので、kyk_nkさんがおっしゃられているように、PageScaling機能がCustomSquareに設定されている必要があると理解しました。

    現時点で、この「PageScaling機能がCustomSquareに設定」という部分が不明です。

    CustomSquareで調べてもなにも出てきません。

    もしお分かりになるようでしたら、「PageScaling機能がCustomSquareに設定」する方法をご教示願えますでしょうか?

    2013年1月10日 1:03
  • ご確認ありがとうございます。

    最初、以下のスレッドを見つけて、そこでの返信でMSDNが引用されていたので、そちらを記載させていただきました。

    Why PageScalingFactor doesn't affect anything?

    「PageScaling機能がCustomSquareに設定」に関しては、時間が良い時に、引き続き調査の協力をさせていただければと思います。

    よろしくお願いします。




    • 編集済み kyk_nk 2013年1月10日 1:53 修正
    2013年1月10日 1:47
  • 返信ありがとうございます。

    はい、こちらのサイトも確認してました。

    やはり、キーはCustomSquareなんですよね。

    こちらでも引き続き調査してみます。

    よろしくお願いします。

    2013年1月10日 4:09
  • 以下のサイトが参考になりますでしょうか?

    (もしかしたら、確認済なのかもしれませんが。。)

    Scaling document using PageScalingFactor

    2013年1月10日 5:28
  • はい、確認済みでした。事後報告になりすみません。。。

    私と同様の質問ですよね。縮尺が利かないという内容。

    で、回答者の方が「you should execute measure() and arrange() methods」

    直訳すると、「寸法()を実行し、()方法を整えるべきです。」

    なんのことかさっぱりです。。。

    単純に、縮尺をしないようにXPSドキュメントを作ったらどうですか?ってことですかね。

    いやぁ、さっぱりですね。

    2013年1月10日 7:06
  • てっきり、関連するクラスのメンバ関数に「Measure()」や「Arrange()」が存在しているのかと解釈してしまいました。

    お役にたてず、恐縮です。。


    • 編集済み kyk_nk 2013年1月10日 7:13
    2013年1月10日 7:13
  • もしかしたら、これまた既知の情報かもですが。。!

    こんなのを見つけました。

    PageScaling

    ここに、「CustomSquare」などが記載されているXMLファイルについての情報がありました!

    もしご参考になるようでしたらご利用ください。

    2013年1月10日 7:45
  • いえいえ、知識不足の私にご助言頂けてるだけでもありがたいですので恐縮などされなくて大丈夫です。

    PageScalingのページ拝見しました。

    一度だけ見たことあるような気もしますが、今改めてみると、PageScalingの構造を記述されているページですかね。

    このXMLをどうこうするというわけではなくて、縮尺や用紙のサイズ設定などはこのページの構造体の各部分へ設定されますよというものかなと思われます。

    このXMLがどこにあるか不明ですが、ここのXMLを編集し、PageScalingScaleに直接縮尺を設定しといてやれば縮尺された状態で印刷?されるかもですが、それだと永久的に縮尺されたままですもんね。

    うーん。。。

    2013年1月10日 9:29
  • 以下補足します。

    「Measure()」や「Arrange()」は、「StackPanel」クラスのメンバ関数のようです。

    家PCで試しにコードをちょこちょこいじってみました。

    (いかんせん、実際に動作するところまでは難しく、今のところこれ以上はわかっていないのですが。。!)

     

    Scaling document using PageScalingFactor(2つ目に記載したリンク)

    ↑このサイトでは、StackPanelのMeasure()やArrange()を呼ぶことで解決できたようですが、


    Why PageScalingFactor doesn't affect anything?(1つ目に記載したリンク)

    ↑ここではちゃんとStackPanelのMeasure()やArrange()を呼んでるみたいですよね。。

     

    なので、また的外れかもですが、せっかくなので投稿してみました。

    ご参考までに、どうぞ。

    ※ 私自身、大変良い勉強になっています。感謝感謝です!





    • 編集済み kyk_nk 2013年1月10日 11:59 追記
    2013年1月10日 11:26
  • 以下、追加で連携いたします。

    「PrintTicket XML ドキュメントの PageScaling 機能が CustomSquare に設定」(PrintTicket.PageScalingFactor プロパティ)

    という記載に関してですが、「PrintTicket」自体が内部的にXMLデータを持っているようです。

    試しに以下のコードを記載してみました。

    PrintTicket tkt = new PrintTicket();
    tkt.PageScalingFactor = 40;
    
    var s = "";
    var memPrintTicket = tkt.GetXmlStream();
    var sr = new System.IO.StreamReader(memPrintTicket);
                
    if(sr.Peek() >=0) {
        s = sr.ReadToEnd();
    }

    そして、変数s内に読み込まれたXMLは以下のとおりでした。

    <?xml version="1.0" encoding="UTF-8"?>
    <psf:PrintTicket xmlns:psf="http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" xmlns:psk="http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1">
      <psf:Feature name="psk:PageScaling">
        <psf:Option name="psk:CustomSquare">
          <psf:ScoredProperty name="psk:Scale">
            <psf:ParameterRef name="psk:PageScalingScale" />
          </psf:ScoredProperty>
        </psf:Option>
      </psf:Feature>
      <psf:ParameterInit name="psk:PageScalingScale">
        <psf:Value xsi:type="xsd:integer">40</psf:Value>
      </psf:ParameterInit>
    </psf:PrintTicket>

    この中に「CustomSquare」というのが存在していますので、こちらのことを言っているのではないでしょうか?

    以上、ご参考までに。


    • 編集済み kyk_nk 2013年1月10日 12:40 修正
    2013年1月10日 12:39
  • 返信遅くなりました。

    回答ありがとうございます。

    当方でもいくつか試してみました。

    まずは、StackPanelのMeasure()やArrange()です。

    まだアカウントの確認がMicroSoft側でされてない?為か、リンクやコードを貼り付けれません。

    見にくくてすみません。

    参考サイト:

    http://msdn.microsoft.com/ja-jp/library/system.drawing.printing.printdocument.printpage(v=vs.80).aspx

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    System.Windows.Controls.StackPanel myPanel = new StackPanel();
    myPanel.Margin = new Thickness(15);

    PrintDialog dialog = new PrintDialog();

    myPanel.Measure(new System.Windows.Size(dialog.PrintableAreaWidth,
                             dialog.PrintableAreaHeight));
    myPanel.Arrange(new Rect(new System.Windows.Point(0, 0),
                    myPanel.DesiredSize));

    try
    {
        streamToPrint = new StreamReader(nextFile);
        try
        {
            printFont = new Font("Arial", 10);
            PrintDocument pd = new PrintDocument();
            pd.PrintPage += new PrintPageEventHandler
               (BatchXPSPrinter.pd_PrintPage);
            pd.Print();
        }
        finally
        {
            streamToPrint.Close();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    PrintDialog dial2 = new PrintDialog();

    // TODO これだと、dial2にドキュメントをセットできてないので、真っ白なものが印刷される。。。

    dial2.PrintVisual(myPanel, "A Great Image.");

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     TODOでも書きましたが、dial2にXPSドキュメントをセットしたいのですが、System.Windows.Contorols.PrintDialogにはPrintDialog.Documentというメソッドがなく。

    System.Windows.Forms.PrintDialogには存在するようです。

    で、そちらを使用すると、今度は、PrintDialog.PrintVisualが使用できなくなりました。

    考えが間違っていると思い、StackPanel 自体にドキュメントをセットするメソッドを探してみましたが見当たらずどうすれば、、、というような状況です。

    2013年1月11日 6:37
  • 続いて、AddJobを使用しないパターンでの印刷を行ってみました。

    参考サイト:

    http://msdn.microsoft.com/ja-jp/library/system.windows.controls.printdialog(v=vs.80).aspx

    ------------------------------------------------------------------------------------------------------------------------------------------------------------

    PrintTicket pt = new PrintTicket();

    // 各種印刷設定
    pt.CopyCount = 2;
    pt.PageOrientation = PageOrientation.Landscape;
    pt.PageScalingFactor = 50;
    pt.Duplexing = Duplexing.Unknown;
    pt.PagesPerSheetDirection = PagesPerSheetDirection.BottomRight;
    pt.PagesPerSheet = 2;
    pt.OutputColor = OutputColor.Unknown;


    // Create the print dialog object and set options
    PrintDialog pDialog = new PrintDialog();
    pDialog.PageRangeSelection = PageRangeSelection.AllPages;
    pDialog.UserPageRangeEnabled = true;
    // ここで印刷設定を行う
    pDialog.PrintTicket = pt;

    // 印刷ダイアログは不要なのでコメントアウト
    // Display the dialog. This returns true if the user presses the Print button.
    //Nullable<Boolean> print = pDialog.ShowDialog();
    //if (print == true)
    //{
          XpsDocument xpsDocument = new XpsDocument(nextFile, FileAccess.ReadWrite);
          FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();
          pDialog.PrintDocument(fixedDocSeq.DocumentPaginator, "Test print job");
    //}

    ------------------------------------------------------------------------------------------------------------------------------------------------------------

    PrintTicketは部数の設定は利いてましたが縮尺は変わらずです。

    ちなみに、印刷直前に、pDialog.PrintTicketをkyk_nkさんが載せていただいたXML出力で見てみると、縮尺には50がちゃんと設定されていました。

    2013年1月11日 6:51
  • ご確認、ありがとうございます。

    質問者さんが実現したいことは以下ののようなことですか?

    ■標準状態(normal.xps)

    normal.xps

    ■縮小状態(small.xps)

    small.xps

     

    このサイト(※1)を参考にして、ここ(※2)からサンプルプロジェクトをダウンロードし、それを少しいじりました。

    私は「PerformTransform」関数の中をいじって、上記のような縮小状態で印刷できることを確認しました。

    それ以外にも、※1のサイトで取り上げている「AdjustFlowDocumentToPage」関数を確認してみるなど、質問者さんが実現したいことに関しての調査のヒントになるようでしたら、是非ご利用ください。

     

    ■参考サイト

    ※1:Scaling XPS documents to fit within printable area

    ※2:XPS ドキュメントの印刷


    • 回答としてマーク t-shino 2013年1月21日 0:15
    2013年1月11日 13:02
  • 返信遅れまして申し訳ありません。

    サイト確認いたしました。参考になりそうでしたので、時間をみつけて実装しようと思います。

    また結果については本スレッドにてご報告させて頂きます。

    よろしくお願いします。

    2013年1月15日 5:46
  • 経過報告です。

    ※1:Scaling XPS documents to fit within printable area

    こちらのサイトを参考にし、kyk_nkさんと同様の処理が出来ることを確認しました。

    現在作成済みのXPSファイルを読み込み、上記内容に組み込もうとしている所です。

    2013年1月17日 1:15
  • 結論です。

    まず、質問内容のPageScalingFactorですが、こちらはXPS Documentでは使用できないという結論に達しました。

    PDFのようなものの為、内部的にデータを読み込んで、そのデータを縮小して新たなXPS documentとし作成する、という方法しかなさそうです。

    ここまでやり取りしましたが、PageScalingFactorが利かない、という当初の質問内容から論点がずれてきていますので一旦クローズといたします。

    回答としてはkyk_nkさんがあげて頂いたサイトが一番有力なものと思いましたので回答としてマークさせて頂きました。

    XPS Documentを読み込んで縮小させる、という方法について不明点などが出ましたら新たに質問させていただくと思います。

    以上です。よろしくお願いします。

    2013年1月21日 0:19