【发布时间】:2020-04-28 14:06:37
【问题描述】:
场景
我正在尝试以编程方式将 MS word (.docx) 文件转换为 PostScript 文件 (.ps)。我这样做是通过使用与 MS Windows 捆绑的默认 PostScript 打印机驱动程序之一创建 PostScript 打印机,然后使用这台打印机从 Word 打印 Word 文档。问题是我正在尝试使用自定义页面尺寸来做到这一点,即高度和宽度与任何标准纸张尺寸都不匹配,即。 A4、A3、信函等
如果我在 MS Word 中手动执行此操作,一切都会按预期工作,但只有当我将页面设置纸张大小设置为 PostScript 自定义页面大小。如果未设置为该值,则输出页面大小是预定义的页面大小之一,即 B5(默认)。
但是,如果我将纸张大小设置为 PostScript 自定义页面大小,然后使用同一台打印机打印,则输出文件的高度和宽度与文档上设置的一样,在本例中为 181mm x 260mm
问题
我找不到以编程方式将页面设置纸张大小值设置为值“PostScript 自定义页面大小”的方法,如果我不设置此值,则自定义高度和宽度将被忽略。
我已经尝试过什么
我已尝试执行以下操作:
-
在 PowerShell 中使用 Word COM 对象
... #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 property,它在页面上表示以下内容
设置 PageHeight 或 PageWidth 属性会将 PaperSize 属性更改为 wdPaperCustom。
查看 PaperSize 属性,它是一个枚举 WdPaperSize,它具有以下 values 但正如您从上面的引用中看到的,如果您设置高度和宽度,则纸张大小将设置为 wdPaperCustom 值。但这与 PostScript 自定义页面大小 不同,据我所知,这不是有效的枚举值之一。
- 纯 PowerShell 打印 word (docx) 文件的唯一方法是使用带有动词 Print 的 Start-Process 命令。如果您不想使用默认打印机,可以将其通过管道传递给 out-printer 命令
Start-Process $file -verb Print | out-printer -name "PrinterName"
这会打印文档,但实际上打开 Word 进行打印有两个问题
一个。您必须手动指定输出文件名
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 中尝试过这个,因为它们似乎都使用了 COM Object API,这可以恢复到我在 1 中的问题。
我认为问题在于 Word 似乎忽略了打印机设置,甚至 Microsoft seems to admit this
我正在使用打印机创建一个 PostScript 打印机,定义特定的纸张尺寸、高度和宽度,但 MS Word 在打印时会忽略这些设置并使用其自己的默认设置。即使 Word 中页面的高度和宽度设置正确,但它的纸张大小属性似乎把事情搞砸了。
所以我能想到的唯一合乎逻辑的事情就是从组合中删除 Word。那里的问题是我找不到任何可以正确处理 Word 的东西。您可以在 PowerShell 中将文件发送到打印机,但它似乎仍然打开 Word 并再次使用 Word 设置。
有谁知道解决此问题的方法或以编程方式将纸张大小设置为 PostScript 自定义页面大小
【问题讨论】:
-
我无能为力,只为您已经收集的内容提供另一个信息:打印机/打印机驱动程序可以将条目添加到这些类型的列表中。如果没有可用的 postscript 打印机(已安装驱动程序),则您要查找的条目在列表中不可用。这就是为什么没有可用的
wd-enumerator。 -
因为我无法使用这样的打印机,所以我无法测试我遇到的唯一方法:每个
wdPaperSize-enum 都有一个等价的数字您可以测试使用值“outside”设置属性" 枚举范围(从 42 开始)以查看 1) Word 是否接受这些值,以及 2) 如果是,则列出该值对应的 your 中的哪个选项。请注意,即使这可行,您机器上对应的值也可能与其他机器上的不同......(请注意,我会在 VBA 中进行测试,因为这会比 out-of 更快、更“立即” -进程代码。) -
在宏运行时哪个打印机设置为在 Word 中处于活动状态可能会有所不同。在快速测试中,将活动打印机设置为 Windows 10 附带的 Microsoft Print to PDF 驱动程序后,页面设置宏(如您的第二个帖子)确实会更改 Word 2019 中的纸张大小。您可以使用 Application.ActivePrinter 设置活动打印机。 docs.microsoft.com/en-us/office/vba/api/…
-
@CindyMeister - 感谢您的花絮。对我来说,打印机已安装,但假设枚举是基于 MS 文档修复的,但我确实注意到枚举具有数值是的,我没有尝试使用值 > 42 来查看是否有效,问题是它可以在一台机器上运行,但不是在每台机器上运行 - 不能保证值是相同的,但感谢您的想法。
-
@JohnKorchok - 我将我正在使用的打印机设置为默认打印机,因此它是活动打印机,我在运行任何逻辑之前也用于测试激活打印机。它不是关于更改纸张大小,而是将其更改为不属于 MS 枚举的特定值。
标签: vba windows powershell ms-word