Сцена
Я пытаюсь программно преобразовать файл MS Word (.docx) в файл PostScript (.ps). Я делаю это, создавая принтер PostScript с одним из драйверов принтера PostScript по умолчанию в комплекте с MS Windows, а затем печатая Word do c, используя этот принтер из Word. Суть в том, что я пытаюсь сделать это с нестандартным размером страницы, то есть высота и ширина не соответствуют ни одному из стандартных форматов бумаги ie. A4, A3, Letter et c
Если я сделаю это вручную в MS Word, все будет работать как положено, НО только если я установлю размер бумаги Page Setup PostScript Custom Page Size . Если это значение не установлено, выходной размер страницы равен одному из предварительно заданных размеров страницы, то есть B5 (по умолчанию).
Но если я установите Размер бумаги на Пользовательский размер страницы PostScript , а затем распечатайте на том же принтере, чтобы выходной файл имел правильную высоту и ширину, как указано в документе, в данном случае 181 мм x 260 мм
Проблема
Не могу найти способ программно установить для параметра «Размер бумаги для страницы» значение «PostScript Custom Page Size», и если я не устанавливайте это значение, тогда пользовательские высота и ширина игнорируются.
Что я уже пробовал
Я пытался сделать следующее:
Использование COM-объекты Word в PowerShell
...
#create com object
$word = New-Object -com Word.Application
#dont open word UI
$word.visible = $false
#open input file
$doc = $word.Documents.Open($inputfile)
$width = [double]$word.MillimetersToPoints($widthInMM)
$height = [double]$word.MillimetersToPoints($heightInMM)
#set page setup width and height
$doc.PageSetup.PageWidth = $width
$doc.PageSetup.PageHeight = $height
#save the changes
$doc.Save()
$pBackGround = 0
$pAppend = 0
$pRange = 0
#print the file to default printer (i.e. ps printer)
$doc.printout([ref]$pBackGround,[ref]$pAppend,[ref]$pRange,[ref]$outputfile)
...
При просмотре документов MS объект PageSetup имеет свойство PageSize , которое сообщает следующее на странице
Установка свойства PageHeight или PageWidth изменяет PaperSi Свойство ze для wdPaperCustom.
И, глядя на свойство PaperSize, его перечисление WdPaperSize, которое имеет следующие значения Но, как вы можете видеть из приведенной выше цитаты, если установить высота и ширина формата бумаги будут установлены в значение wdPaperCustom. НО это не то же самое, что Размер пользовательской страницы PostScript , который, как я прочитал, не является одним из допустимых значений перечисления.
Pure PowerShell Единственный способ напечатать файл слова (docx) - использовать команду Start-Process с глаголом Print. Если вы не хотите использовать принтер по умолчанию, вы можете перенаправить его на команду out-printer
Start-Process $file -verb Print | out-printer -name "PrinterName"
При этом будет напечатан документ, но на самом деле откроется Word для печати, в котором есть 2 проблемы
а. Вы должны вручную указать имя выходного файла
b. Он по-прежнему использует настройки страницы MS Word по умолчанию
Запись макроса VBA: при записи с настройкой правильного формата бумаги не записывается установка его на Пользовательский размер страницы PostScript . Вот как выглядит макрос
With Selection.PageSetup
.LineNumbering.Active = False
.Orientation = wdOrientPortrait
.TopMargin = MillimetersToPoints(13)
.BottomMargin = MillimetersToPoints(13)
.LeftMargin = MillimetersToPoints(13)
.RightMargin = MillimetersToPoints(13)
.Gutter = MillimetersToPoints(3)
.HeaderDistance = MillimetersToPoints(12.5)
.FooterDistance = MillimetersToPoints(12.5)
.PageWidth = MillimetersToPoints(181)
.PageHeight = MillimetersToPoints(260)
.FirstPageTray = wdPrinterDefaultBin
.OtherPagesTray = wdPrinterDefaultBin
.SectionStart = wdSectionNewPage
.OddAndEvenPagesHeaderFooter = True
.DifferentFirstPageHeaderFooter = True
.VerticalAlignment = wdAlignVerticalTop
.SuppressEndnotes = False
.MirrorMargins = True
.TwoPagesOnOne = False
.BookFoldPrinting = False
.BookFoldRevPrinting = False
.BookFoldPrintingSheets = 1
.GutterPos = wdGutterPosLeft
End With
Как вы можете видеть выше, нет упоминания о том, что для формата бумаги задано какое-либо значение. Я не пробовал это в c# или. NET, потому что все они, кажется, используют API-интерфейс COM Object, который возвращает к моим проблемам в 1.
Я думаю, что проблема заключается в что Word, кажется, игнорирует настройки принтера, даже Microsoft, кажется, признает это
С помощью принтера я создаю принтер PostScript, определяющий заданные c формат бумаги, высоту и ширину, но MS Word при печати игнорирует эти настройки и использует собственные настройки по умолчанию. Несмотря на то, что высота и ширина страниц в Word установлены правильно, это свойство размера бумаги, которое, кажется, мешает.
Так что единственная логическая вещь, о которой я могу думать, это удалить Word из смеси. Проблема в том, что я не могу найти ничего, что правильно обрабатывает Word. Вы можете просто отправить файл на принтер, скажем, в PowerShell, но, похоже, он по-прежнему открывает Word и снова использует настройки Word.
Кто-нибудь знает способ обойти это или способ программно установить размер бумаги Пользовательский размер страницы PostScript