现场
我正在尝试以编程方式将MS Word(.docx)文件转换为PostScript文件(.ps)。 我通过使用与MS Windows捆绑的默认PostScript打印机驱动程序创建一个PostScript打印机,然后从Word使用此打印机打印Word文档来实现这一点。 问题是我正在尝试使用自定义页面大小进行此操作,即高度和宽度与任何标准纸张大小(例如A4,A3,Letter等)不匹配。
如果我在MS Word中手动执行此操作,则一切都按预期工作,但前提是我将“页面设置”纸张大小设置为 PostScript自定义页面大小 。 如果未设置为此值,则输出页面大小为预定义的页面大小之一,即B5(默认)。
但是,如果我将纸张大小设置为PostScript自定义页面大小,然后使用同一台打印机打印,输出文件的高度和宽度就与文档设置的正确匹配,例如,此处为181mm x 260mm。问题
我无法以编程方式将页面设置纸张大小值设置为“PostScript自定义页面大小”,如果我不设置此值,则自定义高度和宽度将被忽略。
我已经尝试过的方法
我已经尝试了以下方法:
Using the Word COM objects in 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) ...
Looking at the MS docs, the PageSetup object has a PageSize property, which says the following on the page
纯PowerShell:打印word(docx)文件的唯一方法是使用具有Print动词的Start-Process命令。如果您不想使用默认打印机,则可以将其导出到out-printer命令。
Start-Process $file -verb Print | out-printer -name "PrinterName"
这会打印文档,但实际上会打开 Word 进行打印,存在两个问题:
a. 您必须手动指定输出文件名
b. 它仍然使用 MS Word 的默认页面设置
Recording a VBA Macro: Recording setting the correct paper size doesn't record setting it to PostScript Custom Page Size. This is what the macro looks like
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
As you can see above there is no mention of the paper size being set to any value. I haven't tried this in c# or .NET because they all seem to use the COM Object API which reverts to my issues in 1.
我正在使用打印机创建一个PostScript打印机,定义特定的纸张大小、高度和宽度,但是当打印时,MS Word会忽略这些设置并使用自己的默认设置。即使在Word中页面的高度和宽度被正确设置,但纸张大小属性似乎仍然搅乱了事情。
所以我能想到的唯一合理的做法就是将Word从混合物中移除。但问题在于我找不到任何可以正确处理Word的东西。你可以在PowerShell中直接将文件发送到打印机,但似乎仍然会打开Word并再次使用Word的设置。
有人知道解决此问题的方法或以编程方式设置纸张大小为PostScript自定义页面大小吗?
wdPaperSize
枚举都有一个数字等价物。您可以尝试使用“超出”枚举范围的值(从42开始)设置属性,以查看1)Word是否接受这些值,2)如果是,则该值在您的列表中对应哪个选项。请注意,即使这样做有效,与其他计算机上的相同,对应的值可能不同...(请注意,我会在VBA中进行测试,因为这比进程外代码更快,更“直接”)。 - Cindy Meister