Ориентация страниц/Orientation of pages

Issue #227 resolved
Вячеслав Павлов created an issue

Не работает ориентация страниц при печати.
Orientation of pages does not work.

Comments (17)

  1. Вячеслав Павлов reporter

    Hi Eugene!
    Can you define an approximate term of fix it bug for us, please?
    Thanks!

  2. Eugene Kryukov repo owner

    I confirm that it doesn’t work - but we still have no idea how to fix that - we use GTK+ api correct way to set all settings - but it still doesn’t work. We are working on it

  3. Вячеслав Павлов reporter

    We use official release.
    Realisation of page orientation for linux is empty:
    procedure TPrinterLinux.SetOrientation(Value: TPrinterOrientation);
    begin
    inherited;
    end;

    And farther it no way translate to printer.

  4. Вячеслав Павлов reporter

    Farthermore, it realisation leads to exception if to change a page orientation during print - inherited invokes TPrinter.CheckPrinting that raise an exception.

  5. Вячеслав Павлов reporter

    Не работает ориентация страниц при печати.
    Orientation of pages does not work.
    We need to print documents which have pages with different orientation. But below area of code doesn’t allow to do it:

    procedure TPrinterLinux.SetOrientation(Value: TPrinterOrientation);
    inherited; ← it invoke CheckPrinting(False) and raise exception RaiseError(SPrinting).
    FmuxSetOrientation(Integer(Value));

  6. Eugene Kryukov repo owner

    Ориентацию нельзяменять в процессе печати. Нужно менять перед вызовом BeginDocument

  7. Илья Ненашев

    Те есть если документ Word (или OpenOffice) имеет кучу разделов с разной ориентацией страниц, он не может заслать их на печать одним заданием? Или он сам содержимое страниц вертит, посылая всё, скажем, портретно?

  8. Eugene Kryukov repo owner

    В данном случаем нужно разбивать документ, менять ориентацию и начинать новый документ.

  9. Илья Ненашев

    Это будет новое задание на печать в очереди печати, верно?

  10. Eugene Kryukov repo owner

    Да, но иного пути нет в FMX. В данном случае вам лучше самостоятельно оперировать ориентаций при печати.

  11. Илья Ненашев

    А каким API Вы пользуетесь для реализации работы с принтером? Можете дать ссылку на их доку?

  12. Илья Ненашев

    При печати на принтер “Печатать в файл“ при таком подходе получается файл “вывод.pdf“ (Кстати, гляньте плиз ещё #232 на эту тему) в котором лишь последняя из отправленных порций. И это не вариант: даже если имена файлов смогу задавать, мне нужен один файл, а не много.

    К тому же я вижу, что в этом файле повёрнута в альбомную ориентацию не страница, а содержимое страницы. И да, если пытаюсь вращать по ходу печати, перед новой страницей, то нарываюсь на то, что один или несколько фрагментов текста следующей страницы оказываются повёрнуты по-прежнему, поперёк печатающихся нормально остальных.

    И кстати, я проверил - Libre Office умеет в документе делать страницы разной ориентации, печатает их одним заданием как на принтеры, так и в файл. Про файл спрашивает имя файла, но тут, подозреваю, он сам делает экспорт а не печать.

    В связи с этим вопрос - я по какому признаку могу надёжно отличить принтер “Печатать в файл“ от нормальных принтеров? Например, гарантированно ли он есть и стоит под номером 0? Я б его вообще скрыл, у меня экспорт в PDF есть свой, а этот принтер нам только пользователей путает.

  13. Eugene Kryukov repo owner

    А как вы решаете эту проблему на других платформах ? Насколько мне известно FMX API не позволяет такое реализовать и на Windows.

  14. Илья Ненашев

    “Эту проблему”? Какую из?

    Смену ориентации страниц по мере печати, в рамках одного задания? Просто задаём для каждой страницы нужную, и под виндой оно нормально работает. Мы пользуемся FastReport FMX (https://www.fastreport.ru/ru/product/fast-report-fmx/), извиняюсь, что не обозначил этого раньше. Он релизует по модулю под каждую из целевых ОС, и для винды в FMX.Win.frxPrinter.pas передаёт ориентацию страницы в поле dmOrientation структуры TDeviceMode, и пересоздаёт с нею HDC через виндовый CreateDC или ResetDC. Кстати, там забавное задвоение есть:
    FDC := ResetDC(FDC, FMode^);
    FDC := ResetDC(FDC, FMode^); // needed for some printers

    А библиотечный RTL-ный TPrinterWin там используется, но как-то очень ограничено. Много обращений к WinAPI напрямую, мимо него. Что касается их линуксовой реализации в их FMX.Linux.frxPrinter.pas, там сейчас в TfrxPrinter.SetPrintParams написано так:
    if FPrinterLin.Orientation <> AOrientation then
    begin
    FPrinterLin.Orientation := AOrientation;
    if FPrinting then begin
    EndDoc; // вызывает TfrxPrinter.EndDoc;
    BeginDoc;
    end;
    end;

    procedure TfrxPrinter.BeginDoc;
    begin
    FPrinting := True;
    FCanvas := FPrinterLin.Canvas;
    //FCanvas := FMX.Printer.Printer.Canvas;
    FIsFirst := True;
    UpdateDeviceCaps;
    FPrinterLin.BeginDoc;
    FCanvas := FPrinterLin.Canvas;
    if Assigned(FOnDocStarted) then
    FOnDocStarted(Self);
    end;

    Отличание принтера для “печати в PDF” от прочих нормальных принтеров и его скрытие из перечня доступных? Под виндой этой задачи нет, такой принтер там на усмотрение пользователя, а не встроенный системный самый первый и не отключаемый. Поэтому даже не заморачивались… У многих наших пользователей его нет, а у кого есть - тот сам ставил и знает как пользоваться и зачем.

    Задание имени файла для принтера, сохраняющего в файл? Пробовал, под виндой работает реализация в FastReport FRX, которая для винды суёт имя файла в TDocInfo.lpszOutput := PChar(FFileName) перед собственным вызовом винапишного StartDoc в обход TPrinterWin.DoBeginDoc, это поле не заполняющего.

  15. Log in to comment