Страница обрезана и повернута неправильно при печати с 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.

Другие вопросы по тегам