如何在没有 PDF 打印机的情况下使用 Microsoft Office 将通用页面范围导出为 PDF?

如何在没有 PDF 打印机的情况下使用 Microsoft Office 将通用页面范围导出为 PDF?

我目前正在尝试将 Excel 文档保存为 PDF,但同样的过程可以应用于 Word 文档。我想将特定范围的页面(例如第 1、3-5 和 8 页)保存到 PDF 文件。

当我尝试将文件保存为 PDF 时,当我选择 PDF 作为文件类型并单击“选项...”按钮时,在“页面范围”下只给出了两个选项。我可以选择 或AllPage(s)这允许我仅选择一个范围(例如 1-10 就是这样)。

有没有办法保存通用的页面范围,类似于我打印文档时的情况,这样我就可以输入1, 3-5, 8要包含在 PDF 中的以逗号分隔的页面列表(如)?

虽然我并不羞于使用 VBA,但我想避免使用PDF 打印机,因为我无法在工作电脑上安装驱动程序(没有管理权限)。我还想尝试保持页码一致(如果我打印第 1、4、5 和 8 页,底部会显示“第 1 页,共 3 页”、“第 2 页,共 3 页”等)。我知道这是可能的,因为当我将文档导出为包含多个选定单元格的 PDF 时会发生这种情况。

谢谢。

答案1

我知道您更喜欢直接在 Word 中执行此操作,但由于缺乏真正的解决方案,因此我建议使用 PDFsam(PDF 拆分和合并),只要机器上有 Java,就无需安装即可使用。

您可以使用 PDFsam 轻松地对文档进行拆分、重新排序、合并和随机排序

从获取http://www.pdfsam.org/

问:pdfsam 是什么?

PDF Split and Merge 是一款非常简单、易于使用、免费的开源实用程序,用于拆分和合并 pdf 文件。它有两个版本:基本版和增强版。包括一个控制台和一个 GUI 界面。

答案2

Excel 文档在 OpenOffice 中看起来是什么样的?

OpenOffice 可以直接导出为 PDF,并且您可以获得便携的版本的 OpenOffice,因此它不需要安装在系统中。

答案3

尝试。这是一个作为打印机安装的 PDF 创建应用程序。您只需指定页面范围并打印到此“打印机”即可。

答案4

我终于找到了解决我的问题的方法,使用一些 VBA 代码和ExportAsFixedFormat方法基本上,该函数将导出当前范围带有类型和文件名。下面的答案虽然针对我的情况,但很容易适应任何人的情况。

经过一番深思熟虑和编码,我想出了一个解决方案来找到适当的范围 - 尽管它远非完美。我编写了以下 VBA 函数(仅适用于 Excel),它返回两个水平分页符之间的范围(您需要指定起始列和结束列):

' Name: Get Range
' Desc: Returns a string representing a range (e.g. "A1:Z30"), which encompasses the specified page breaks.
' Args: startHPBreak - Used to determine which starting page break to use, from 0 up to the number of pagebreaks.
'       endHPBreak   - Used to determine the last page break to return up to.
Function GetRange(ByVal startHPBreak As Long, ByVal endHPBreak As Long) As String
    Dim startCol, endCol As String    ' First, we define our starting/ending columns.
    startCol = "A"
    endCol   = "Z"
    Dim numHPBreaks      As Long      ' Holds the total number of horizontal page breaks.
    Dim startRow, endRow As Long      ' Holds the starting/ending rows of the range.
    ' First, we get the total number of page breaks.
    numHPBreaks = ActiveSheet.HPageBreaks.Count
    ' Then, we check to see the passed ranges are valid (returns a blank string if they are not).
    If (startHPBreak <  0)            Or (startHPBreak > numHPBreaks) Then Exit Function
    If (endHPBreak   <= startHPBreak) Or (endHPBreak   > numHPBreaks) Then Exit Function
    ' Next, we build our string by obtaining our starting and ending rows.
    If startHPBreak = 0 Then    ' If we're starting at the 0th page break...
        startRow = 1                ' Then start exporting at the first row.
    Else                        ' Else, just get the starting page break row.
        startRow = ActiveSheet.HPageBreaks(startHPBreak).Location.Row
    End If
    ' Lastly, we get the ending page break row, build the range as a string, and return it.
    endRow = ActiveSheet.HPageBreaks(endHPBreak).Location.Row - 1
    GetRange = startCol & startRow & ":" & endCol & endRow
End Function

有一些注意事项,主要是您需要定义水平分页符才能使其工作。 在我的情况下,这个函数起作用了,但每页都有图表。 每当我尝试在单个页面上使用范围时,后续页面上的图表都会因某种原因被切断,因此我编写了以下函数将每个页面添加为字符串中的不同范围:

最后,创建的范围通过以下函数传递给ExportAsFixedFormat我的答案顶部详述的函数(我只想导出第 1-2 页和第 12-17 页):

' Name: Export Pages
' Desc: Exports the specified pages/range in the function to the passed filename as a PDF.
' Args: outFileName - Full or relative file name (include the extension) to export the file as.
Sub ExportPages(outFileName As String)
    Dim outputRange As String    ' Used to build the output range.
    Dim currPage    As Byte      ' Holds the current page we want to export.
    ' There are no graphs on the first two pages, so we can get that range all at once.
    outputRange = GetRange(0, 2)
    ' Next, we loop through and add pages 12 to 17 to the range (since they have graphs).
    For currPage = 12 To 17
        ' We build the range one page at a time, and seperate the ranges with commas.
        outputRange = outputRange & "," & GetRange(currPage - 1, currPage)
    Next currPage
    ' Finally, we use the outputRange string to specify the range, and export it as a PDF.
    ActiveSheet.Range(outputRange).ExportAsFixedFormat _
        Type                 := xlTypePDF, _
        Filename             := outFileName, _
        Quality              := xlQualityStandard, _
        IncludeDocProperties := True, _
        IgnorePrintAreas     := False, _
        OpenAfterPublish     := True
End Sub

请注意,我必须一次添加第 12 至 17 页的范围,否则(如我所述)我的图表将被截断。我不知道为什么我必须这样做,但最终还是成功了。希望我在这里发布的内容足以让某人正确使用 VBA 代码将文档导出为 PDF 文件。

如果将来有人能提出更好的解决方案,请将其作为答案发布,我们会考虑。

相关内容