Установка формата бумаги MS Word на нестандартный размер страницы PostScript - PullRequest
2 голосов
/ 28 апреля 2020

Сцена

Я пытаюсь программно преобразовать файл 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 (по умолчанию).

Word default paper size - B5

Но если я установите Размер бумаги на Пользовательский размер страницы PostScript , а затем распечатайте на том же принтере, чтобы выходной файл имел правильную высоту и ширину, как указано в документе, в данном случае 181 мм x 260 мм

PostScript Custom Page Size

Проблема

Не могу найти способ программно установить для параметра «Размер бумаги для страницы» значение «PostScript Custom Page Size», и если я не устанавливайте это значение, тогда пользовательские высота и ширина игнорируются.

Что я уже пробовал

Я пытался сделать следующее:

  1. Использование 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

1 Ответ

1 голос
/ 05 мая 2020

Для всех, кто интересуется, как я решил эту проблему, я бы сказал, решил, но это скорее другое решение для достижения того же результата.

Я до сих пор не нашел способ изменить размер бумаги на PostScript Custom Page Size , но вместо этого мне удалось изменить размер бумаги в зависимости от ширины и высоты, заданных в документе (согласно документации), что для меня кажется лучшим решением. Вот шаги, которые я предпринял для ее решения:

  1. Выберите драйвер PostScript, который я хочу использовать. Я решил использовать драйвер Xerox PS Class , который представляет собой драйвер PostScript в комплекте с Windows.

  2. Найдите, где находится драйвер. Драйверы принтера для Windows находятся в следующем каталоге

     C:\Windows\System32\DriverStore\FileRepository\
    

    Вы можете найти нужный драйвер после использования следующей команды grep like

     findstr /S /I /M /C:"Xerox PS Class Driver" C:\Windows\System32\DriverStore\FileRepository\*.*
    
  3. Отредактировано файл PPD и добавил нужный размер бумаги и установил его в качестве размера бумаги по умолчанию. Наиболее импортируемая часть для обновления - PageSize , она предоставляет значение вызова для вызова поддерживаемых размеров страницы. Я удалил все остальные размеры страниц и просто добавил тот, который был после, назвав его Пользовательский

    *% Page Size
    *OpenUI *PageSize: PickOne
    *OrderDependency: 40 AnySetup *PageSize
    *DefaultPageSize: Custom
    *PageSize Custom/Custom: "featurebegin{<< /PageSize [369 522] >> setpagedevice}featurecleanup"
    *CloseUI: *PageSize
    

Значения в этом фрагменте приведены в пунктах, поэтому вам нужно конвертировать их. Выше я использую 130 мм x 184 мм ~ 369 точек x 522 точки

Больше информации о файлах PPD в его spe c документе

Добавлен принтер, использующий этот скорректированный драйвер принтера

Add-Printer -Name "PrinterName" -DriverName "Xerox PS Class Driver" -PortName "file:"

Для простоты я назвал свой принтер размером страницы, т.е. 130x184 , поэтому его легко использовать программно

Создана новая форма в свойствах сервера печати, которая соответствует моему новому размеру бумаги. Для этого откройте Устройства и принтеры> Нажмите на свой принтер> Нажмите Свойства сервера печати в верхнем меню> Установите флажок «Создать новую форму»> Добавьте имя и задайте свои размеры> Сохранить форму

enter image description here

Используя мой код PowerShell выше, когда размеры страницы моего документа установлены правильно, и мой новый принтер установлен по умолчанию, новая форма, которую я только что создал выше, найдена, потому что наш принтер теперь обрабатывает новые измерения страницы. В моем сценарии выше я на самом деле устанавливаю принтер в качестве принтера по умолчанию на Windows. Я просто пропустил эту часть, поэтому либо добавьте его в скрипт, либо вручную установите принтер в качестве принтера по умолчанию.

Напечатан файл PostScript на новом принтере

Надеюсь, это поможет кому-то еще

...