Como exportar um intervalo de páginas genéricas para PDF usando o Microsoft Office * sem * uma impressora PDF?

6

No momento, estou tentando salvar um documento do Excel em PDF, mas o mesmo processo pode ser aplicado a um documento do Word. Gostaria de salvar um intervalo específico de páginas (por exemplo, páginas 1, 3-5 e 8) no arquivo PDF.

Quando tento salvar o arquivo como PDF, quando seleciono PDF como o tipo de arquivo e clico no botão "Opções ...", só tenho duas opções em "Intervalo de páginas". Posso selecionar All ou Page(s) , o que me permite selecionar apenas um único intervalo (por exemplo, 1-10 e é isso).

Existe alguma maneira de salvar um intervalo genérico de páginas, semelhante a quando eu estou imprimindo o documento, para que eu possa inserir uma lista de páginas separadas por vírgulas (como 1, 3-5, 8 ) para incluir no PDF? / strong>

Embora não tenha vergonha de usar o VBA, gostaria de evitar o uso de uma impressora PDF , pois não posso instalar drivers no meu computador de trabalho (sem privilégios administrativos). Eu também quero tentar manter os números de página consistente (se eu imprimir as páginas 1,4,5 e 8, ele diz na parte inferior "Página 1 de 3", "Página 2 de 3", etc). Eu sei que isso é possível, já que isso acontece quando eu exporto o documento como um PDF com várias células selecionadas.

Obrigado.

    
por Breakthrough 28.06.2011 / 20:55

4 respostas

1

Eu finalmente encontrei uma solução para o meu problema, usando algum código VBA e o ExportAsFixedFormat method . Basicamente, essa função exportará o intervalo atual com um tipo e um nome de arquivo. A resposta abaixo, embora específica para o meu caso, é facilmente adaptada à situação de qualquer pessoa.

Após algumas deliberações e codificações, encontrei uma solução para encontrar os intervalos adequados - embora esteja longe de ser perfeito. Eu escrevi a seguinte função VBA (para uso somente com o Excel), que retorna o intervalo entre duas quebras de página horizontais (você precisa especificar as colunas inicial e final):

' 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

Existem algumas advertências, principalmente que você precisa ter quebras de página horizontais definidas para que isso funcione. No meu caso, essa função funcionou, mas havia gráficos em cada página. Sempre que eu tentei usar um intervalo em uma única página, os gráficos nas páginas subseqüentes seriam todos cortados por algum motivo, então eu escrevi a seguinte função para adicionar cada página como um intervalo diferente em uma string:

Finalmente, o intervalo criado foi passado para a função ExportAsFixedFormat , conforme detalhado na parte superior da minha resposta, através da seguinte função (eu queria apenas exportar as páginas 1-2 e 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

Note que eu tive que adicionar o intervalo para as páginas 12 a 17, uma por vez, caso contrário (como mencionei), meus gráficos seriam cortados. Eu não sei porque eu tive que fazer isso, mas funcionou no final. Espero que o que eu tenha postado aqui seja o suficiente para colocar alguém no caminho certo usando o código VBA para exportar um documento como um arquivo PDF.

Se alguém puder encontrar uma solução melhor no futuro, poste-a como resposta e ela será considerada.

    
por 08.07.2011 / 16:03
2

Eu sei que você preferiria fazer isso diretamente do Word, mas sem uma solução real para fazer isso, gostaria de sugerir o PDFsam (PDF Split and Merge) que, desde que o Java esteja disponível na máquina, não precisa ser instalado para ser usado.

Você pode dividir, reordenar, mesclar e embaralhar documentos com bastante facilidade usando o PDFsam

Obtenha o link

What is pdfsam?

PDF Split and Merge is a very simple, easy to use, free, open source utility to split and merge pdf files. It’s released in two versions: basic and enhanced. Includes a console and a GUI interface.

    
por 28.06.2011 / 21:05
2

Como o documento excel olha dentro do OpenOffice?

O OpenOffice pode exportar diretamente para PDF, e você pode obter uma versão Portátil do OpenOffice para que ele não precise para ser instalado no sistema.

    
por 29.06.2011 / 03:29
2

Experimente este . É um aplicativo criador de PDF que é instalado como uma impressora. Você acabou de especificar o intervalo de páginas e imprimir para esta 'impressora'.

    
por 05.03.2013 / 21:36