WinForms. Как печатать с помощью PrintDocument в точных координатах в дюймах или сантиметрах [дубликат]

Использовать фиктивный хост и его переменные

Например, передать токен K8S и хэш от мастера к рабочим.

На главном

- name: "Cluster token"
  shell: kubeadm token list | cut -d ' ' -f1 | sed -n '2p'
  register: K8S_TOKEN

- name: "CA Hash"
  shell: openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
  register: K8S_MASTER_CA_HASH

- name: "Add K8S Token and Hash to dummy host"
  add_host:
    name:   "K8S_TOKEN_HOLDER"
    token:  "{{ K8S_TOKEN.stdout }}"
    hash:   "{{ K8S_MASTER_CA_HASH.stdout }}"

- name:
  debug:
    msg: "[Master] K8S_TOKEN_HOLDER K8S token is {{ hostvars['K8S_TOKEN_HOLDER']['token'] }}"

- name:
  debug:
    msg: "[Master] K8S_TOKEN_HOLDER K8S Hash is  {{ hostvars['K8S_TOKEN_HOLDER']['hash'] }}"

На рабочем

- name:
  debug:
    msg: "[Worker] K8S_TOKEN_HOLDER K8S token is {{ hostvars['K8S_TOKEN_HOLDER']['token'] }}"

- name:
  debug:
    msg: "[Worker] K8S_TOKEN_HOLDER K8S Hash is  {{ hostvars['K8S_TOKEN_HOLDER']['hash'] }}"

- name: "Kubeadmn join"
  shell: >
    kubeadm join --token={{ hostvars['K8S_TOKEN_HOLDER']['token'] }}
    --discovery-token-ca-cert-hash sha256:{{ hostvars['K8S_TOKEN_HOLDER']['hash'] }}
    {{K8S_MASTER_NODE_IP}}:{{K8S_API_SERCURE_PORT}}
12
задан Agnel Kurian 27 August 2009 в 15:29
поделиться

1 ответ

Ответ был довольно долгим после нескольких изменений, так что вот окончательный результат:

Установка свойства PageUnit объекта Graphics в GraphicsUnit.Pixel и принятие в умножении координат с значения DpiX и DpiY отображают ожидаемый результат как на устройствах отображения, так и на принтере.

private static void DrawInchLine(Graphics g, Color color, Point start, Point end)
{
    GraphicsUnit originalUnit = g.PageUnit;
    g.PageUnit = GraphicsUnit.Pixel;
    using (Pen pen = new Pen(color, 1))
    {
        g.DrawLine(pen,
            start.X * g.DpiX,
            start.Y * g.DpiY,
            end.X * g.DpiX,
            end.Y * g.DpiY);
    }
    g.PageUnit = originalUnit;
}

Вы можете нарисовать его на форме (или некотором контроле):

using (Graphics g = this.CreateGraphics())
{
    Point start = new Point(1, 1);
    Point end = new Point(2, 1);
    DrawInchLine(g, Color.Black, start, end);
}

... или отправить вывод на принтер:

PrintDialog dialog = new PrintDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
    PrintDocument pd = new PrintDocument();
    pd.PrinterSettings = dialog.PrinterSettings;
    pd.PrintPage += (psender, pe) =>
    {
        Point start = new Point(1, 1);
        Point end = new Point(2, 1);
        DrawInchLine(pe.Graphics, Color.Black, start, end);
        pe.HasMorePages = false;
    };

    pd.Print();
}

Это, однако, полагается на установку PageUnit.

12
ответ дан Fredrik Mörk 19 August 2018 в 03:58
поделиться
  • 1
    Вы можете попробовать CutePDF для эмулятора принтера. Вы можете видеть различия там. – Agnel Kurian 27 August 2009 в 13:59
  • 2
    Я просто понял, что у меня есть принтер. пытался напечатать на нем; вышел ровно на один дюйм. Будет обновлен код. – Fredrik Mörk 27 August 2009 в 14:04
  • 3
    Спасибо Fredrik, но мне нужно сделать это, используя только Math, без изменения параметра PageUnit. Изменение параметра PageUnit повлияет на ширину пера. См. Последнюю часть моего вопроса. – Agnel Kurian 27 August 2009 в 14:29
  • 4
    Ах, пропустил эту часть ... К сожалению, я не вижу простого решения, кроме использования Pixel в качестве базового блока для всего рисования и масштабирования его на целевом устройстве с помощью DpiX и DpiY. – Fredrik Mörk 27 August 2009 в 14:49
  • 5
    Я все равно соглашусь. Это довольно информативно. – Agnel Kurian 27 August 2009 в 15:28
Другие вопросы по тегам:

Похожие вопросы: