Ориентация страниц/Orientation of pages
Не работает ориентация страниц при печати.
Orientation of pages does not work.
Comments (17)
-
Account Deactivated reporter -
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
-
repo owner Do you use FmxLinux from GetIt or official release from us ?
-
Account Deactivated 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.
-
Account Deactivated reporter Farthermore, it realisation leads to exception if to change a page orientation during print - inherited invokes TPrinter.CheckPrinting that raise an exception.
-
repo owner - changed status to resolved
Fixed at 1.44
-
Account Deactivated 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)); -
repo owner Ориентацию нельзяменять в процессе печати. Нужно менять перед вызовом BeginDocument
-
Те есть если документ Word (или OpenOffice) имеет кучу разделов с разной ориентацией страниц, он не может заслать их на печать одним заданием? Или он сам содержимое страниц вертит, посылая всё, скажем, портретно?
-
repo owner В данном случаем нужно разбивать документ, менять ориентацию и начинать новый документ.
-
Это будет новое задание на печать в очереди печати, верно?
-
repo owner Да, но иного пути нет в FMX. В данном случае вам лучше самостоятельно оперировать ориентаций при печати.
-
А каким API Вы пользуетесь для реализации работы с принтером? Можете дать ссылку на их доку?
-
При печати на принтер “Печатать в файл“ при таком подходе получается файл “вывод.pdf“ (Кстати, гляньте плиз ещё #232 на эту тему) в котором лишь последняя из отправленных порций. И это не вариант: даже если имена файлов смогу задавать, мне нужен один файл, а не много.
К тому же я вижу, что в этом файле повёрнута в альбомную ориентацию не страница, а содержимое страницы. И да, если пытаюсь вращать по ходу печати, перед новой страницей, то нарываюсь на то, что один или несколько фрагментов текста следующей страницы оказываются повёрнуты по-прежнему, поперёк печатающихся нормально остальных.
И кстати, я проверил - Libre Office умеет в документе делать страницы разной ориентации, печатает их одним заданием как на принтеры, так и в файл. Про файл спрашивает имя файла, но тут, подозреваю, он сам делает экспорт а не печать.
В связи с этим вопрос - я по какому признаку могу надёжно отличить принтер “Печатать в файл“ от нормальных принтеров? Например, гарантированно ли он есть и стоит под номером 0? Я б его вообще скрыл, у меня экспорт в PDF есть свой, а этот принтер нам только пользователей путает.
-
Евгений?
-
repo owner А как вы решаете эту проблему на других платформах ? Насколько мне известно FMX API не позволяет такое реализовать и на Windows.
-
“Эту проблему”? Какую из?
Смену ориентации страниц по мере печати, в рамках одного задания? Просто задаём для каждой страницы нужную, и под виндой оно нормально работает. Мы пользуемся 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, это поле не заполняющего.
- Log in to comment
Hi Eugene!
Can you define an approximate term of fix it bug for us, please?
Thanks!