Страница обрезана и повернута неправильно при печати с Ghostscript
Я пытался напечатать одностраничный PDF-файл из командной строки (hostscript версии 9.22) или консольного приложения.NET, используя ghostscript.net (версия 1.2.1). Файл (PDF версия 1.7 - Acrobat 8.x) имеет размер A3, и я хочу напечатать его на A4. Это выглядит так: Переключатели, которые я использую
-empty -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -dNumCopies = 1 -sDEVICE = mswinpr2 -sOutputFile =% printer% MSPrintToPDF -fd: \ test.pdf
(разные pdf (primopdf, dopdf8, принтер Microsoft pdf) и настоящие принтеры)
Переключатели, различные комбинации которых я пробовал:
-sPaperSize = a4 -g2490x1000 -dFIXEDMEDIA -dFIXEDRESOLUTION -r300 -dAutoRotatePages -dfitpage -dPDFFitPage -dEPSFitPage -dDEVICEWIDTHPOINTS = 3500 -dDEVICEHEIGHTPOIENT =2000 -D ложь = 2000 =
Без этого:
-dDIVICEWIDTHPOINTS=3500 -dDEVICEHEIGHTPOINTS=2000
результат обрезается и не вращается правильно:
В противном случае результат будет пейзажным, хотя все еще обрезанным:
Как можно распечатать PDF формата А3 на странице А4, соответствующей размеру страницы?
Спасибо
2 ответа
Мое решение, предложенное @KenS:
string printerName = "hp";
string inputFile = @"d:\test.pdf";
string tempFilePath = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".tmp.pdf";
List<string> switches = new List<string>();
switches.Add(string.Empty);
switches.Add("-dNOPAUSE");
switches.Add("-dBATCH");
switches.Add("-sDEVICE=pdfwrite");
switches.Add("-dSAFER");
switches.Add("-dCompatibilityLevel=1.5");
switches.Add("-dColorConversionStrategy=/LeaveColorUnchanged");
switches.Add("-dSubsetFonts=true");
switches.Add("-dEmbedAllFonts=true");
switches.Add("-sDEFAULTPAPERSIZE=a4");
switches.Add("-sPAPERSIZE=a4");
switches.Add("-dAutoRotatePages=/PageByPage");
switches.Add("-dFIXEDMEDIA");
switches.Add("-dPDFFitPage");
switches.Add($"-sOutputFile={tempFilePath}");
switches.Add("-c");
switches.Add("-f");
switches.Add(inputFile);
processor.StartProcessing(switches.ToArray(), null);
switches = new List<string>();
switches.Add("-dPrinted");
switches.Add("-dBATCH");
switches.Add("-dNOPAUSE");
switches.Add("-dNOSAFER");
switches.Add("-dNumCopies=1");
switches.Add("-sDEVICE=mswinpr2");
switches.Add("-sOutputFile=%printer%" + printerName);
switches.Add("-sDEFAULTPAPERSIZE=a4");
switches.Add("-sPAPERSIZE=a4");
switches.Add("-dFIXEDMEDIA");
switches.Add("-dPDFFitPage");
switches.Add("-q");
switches.Add("-f");
switches.Add(tempFilePath);
processor.StartProcessing(switches.ToArray(), null);
Большинство элементов управления, которые вы устанавливаете, не влияют на устройство рендеринга или не влияют на устройство mswinpr2.
Устройство mswinpr2 управляется в основном Windows. Что происходит, так это то, что размер и разрешение носителя определяются путем запроса конфигурации принтера по умолчанию, если только вы не позволите всплывающему диалоговому окну печати, и в этом случае введенная вами конфигурация будет той, которая используется.
Tha создает контекст устройства принтера Windows. Входной файл затем отображается в растровом изображении, и это растровое изображение рисуется в контексте устройства. Наконец, контекст устройства должен напечатать сам.
Результатом всего этого является то, что, в принципе, то, что вы пытаетесь сделать, просто не сработает. Используемые вами элементы управления переопределяются конфигурацией принтера, поэтому масштабирование не выполняется.
Обычно я бы не советовал этого, но лучшим решением в этом случае будет запуск исходного файла через устройство ps2write или pdfwrite (или в следующем выпуске 9.23 одно из устройств pdfimage). Получите правильный размер, ориентацию и масштабирование в этом выходном файле (вам, вероятно, будет проще проверить PDF. Затем возьмите этот измененный PDF-файл и распечатайте его через устройство mswinpr2.