Ghostscript обрезает PDF-файл
Я пытаюсь распечатать PDF с Ghostscript, используя следующие настройки:
var switches = new List<string>
{
@"-empty",
@"-dPrinted",
@"-dNOPAUSE",
@"-dNOSAFER",
@"-dQUIET",
@"-dPDFSETTINGS=/printer",
@"-dNumCopies=1",
@"-sDEVICE=mswinpr2",
@"-dCompatibilityLevel=1.4",
@"-sOutputFile=%printer%" + printerSettings.PrinterName,
@"-f",
pdfFileName
};
но либо PDF, либо Ghostscript имеют плохие поля, и хотя это хорошо, когда я печатаю его, чтобы подать клипы, когда я печатаю его на своем принтере.
Есть ли способ добавить это программно с Ghostscript? Я пробовал много разных решений с первых страниц Google, но ни одно из них не работает, и они, похоже, не влияют на печатный PDF.
Когда я пытаюсь распечатать его с помощью Adobe или IE, он волшебным образом добавляет поля, как только я выбираю принтер, и он печатается нормально.
Как добиться того же с Ghostscript?
1 ответ
Хорошо, во-первых, многие из переключателей, которые вы устанавливаете, не действуют:
-empty не является переключателем, понятным для Ghostscript, и я немного удивлен, что он не вызывает ошибку.
-dPDFSETTINGS влияет только на устройство pdfwrite, поэтому оно описано в разделе "Векторные устройства".
-dCompatabilityLevel влияет только на вывод устройства pdfwrite.
-dNOSAFER не имеет никакого эффекта, так как это настройка по умолчанию.
-f используется для "закрытия" прямой вставки PostScript, начинающейся с -c, если вы не используете -c, вам не нужен -f
Теперь почти наверняка ни Ghostscript, ни ваш PDF не имеют "плохих полей", наиболее вероятное объяснение вашей проблемы заключается в том, что используемый вами принтер не может печатать на границах страницы, левом / правом краях и, возможно, верхнем и нижнем краях. используются механизмом транспортировки бумаги, и принтер не может там печатать.
Чтобы справиться с этим, вам нужно уменьшить размер изображения, что вы, вероятно, "можете" сделать, установив -dDEVICEWIDTHPOINTS и -dDEVICEHEIGHTPOINTS и -dFIXEDMEDIA. Это будет зависеть от вас, чтобы определить правильные значения ширины и высоты.
Добавлено после комментариев ниже
Эта проблема состоит из двух частей: первая - определить размер фактической доступной области для печати и масштабировать вывод до этого размера. Второе - это затем переместить вывод на носитель так, чтобы он был напечатан. Если, как вы говорите, контент значительно меньше, чем носитель, вы можете игнорировать его масштабирование, но полное решение представлено здесь для полноты.
Теперь, как уже упоминалось ранее, первая часть этого достигается в основном путем создания холста фиксированного размера; это делается с помощью любого из переключателей выбора носителя и добавления -dFIXEDMEDIA.
ПРИМЕЧАНИЕ. Если вы изменяете размер носителя, то, очевидно, вы также должны изменить масштаб содержимого, иначе он не будет соответствовать. Поэтому вам также необходимо установить PSFitPage, EPSFitPage или PDFFitPage в зависимости от типа ввода (в самых последних версиях Ghostscript можно использовать -dFitPage независимо от типа ввода).
В качестве эксперимента я использовал файл /ghostpdl/examples/text_graphic_image.pdf и отправил вывод на принтер в FILE:
Эта командная строка:
gswin32 -dDEVICEHEIGHTPOINTS=391 -dDEVICEWIDTHPOINTS=306 -dFIXEDMEDIA -sDEVICE=mswinpr2 -sOutputFile=%printer%KensPrinter /ghostpdl/examples/text_graphic_image.pdf
производит вывод, где 3/4 изображения обрезается (содержимое находится вне вновь определенного фиксированного размера холста). Если я изменю это на:
gswin32 -dDEVICEHEIGHTPOINTS=391 -dDEVICEWIDTHPOINTS=306 -dFIXEDMEDIA -dPDFFitPage -sDEVICE=mswinpr2 -sOutptuFile=%printer%KensPrinter /ghostpdl/examples/text_graphic_image.pdf
в результате получается идеальное воспроизведение оригинала размером 1/4 (половина в каждом направлении).
Итак, первое, что вам нужно сделать, это установить фактическую область печати на вашем принтере, затем вы можете правильно установить ширину и высоту как фиксированный носитель и сказать Ghostscript, чтобы масштабировать страницу, чтобы она соответствовала размеру.
Однако это все равно оставит напечатанное изображение в левом нижнем углу носителя. Поскольку это область, которая не может быть напечатана, вам необходимо сместить напечатанное изображение, пока оно не окажется в центре страницы. Как я и предлагал, вы можете сделать это с помощью процедуры BeginPage. Это:
gswin32 -dDEVICEHEIGHTPOINTS=391 -dDEVICEWIDTHPOINTS=306 -dFIXEDMEDIA -dPDFFitPage -sDEVICE=mswinpr2 -sOutptuFile=%printer%KensPrinter -c "<</BeginPage {100 100 translate}>> setpagedevice" -f /ghostpdl/examples/text_graphic_image.pdf
производит вывод, где напечатанное изображение сдвигается вверх и вправо на 100 точек каждая.
Я считаю, что небольшое расследование позволит вам выяснить, где именно ваш принтер способен печатать, и создать непечатаемые поля соответствующего размера.
Обратите внимание, что для меня синтаксис%printer% не приводит к диалогу выбора принтера. Я подозреваю, что ваш код (на каком бы языке это ни было) расширяет%p, что приводит к искажению имени. Или, возможно, все, что вы используете для форка процесса Ghostscritp, делает это. В любом случае вам, вероятно, нужно удвоить знаки%.
Сначала вы должны заставить это работать из командной строки, а затем поработать над получением его в приложении.