[StarBasic] OOo-Calc - einzelnes Blatt als PDF exportieren

Ernst_42

schläft auf dem Boardsofa
Hallöchen liebe Programmierer-Experten...
nach Stunden vergeblicher Suche stelle ich mal hier meine Frage.

Hier läuft:
OpenOffice 3.x als NeoOffice/J 3.x
auf Mac OS X 10.6.x

Aufgabenstellung:
  1. Ich möchte in einem Calc-Dokument einzelne(!) Blätter als PDF exportieren.
  2. Der Ordnername wird einer Zelle entnommen, die das Datum der letzten (automatisierten) Überarbeitung enthält.
  3. Die Namen der Tabellenblätter werden als Dateinamen übernommen.

Bisher gelöst:
2. und 3. (trivial)
ungelöst:
1.

Problem:
Die Methode StoreToURL scheint nur für das Dokument selbst, nicht aber für einzelne Blätter zu funktionieren. => Es wird das gesamte Dokument als PDF exportiert :(
Die Methode Print scheint nicht für den PDF-Export geeignet zu sein (wäre über den Dialog aber die Möglichkeit, nur ein einzelnes Blatt zu "drucken").
(Im Code rot markiert.)

Kann mir jemand einen Fingerzeig geben? TIA

Meine Lösung bisher:
Code:
Sub myPDFExport
	const ci_Sh_num as integer = 5
	dim document   as object
	dim dispatcher as object
	dim i as integer
	dim args0(0) as new com.sun.star.beans.PropertyValue

[COLOR="Gray"]	rem		NICHT ABGEFANGEN WIRD DERZEIT, 
	rem		FALLS DER ENTSPRECHENDER ORDNER NOCH NICHT EXISTIERT !!!

	rem get access to the document[/COLOR]
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

[COLOR="Gray"]	rem - Hole aktuellen Stand (Datum)[/COLOR]
	args0(0).Name = "ToPoint"
	args0(0).Value = "Version_Date"
	dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args0())

	dim dayFormatted as string 
	dayFormatted = right(ThisComponent.getCurrentSelection().getstring(),10)
	dayFormatted = left(version_date,4) + mid(version_date,6,2) + right(version_date,2)  

[COLOR="Gray"]	rem - Export PDF - Attributes[/COLOR]
	dim pdfProperties(0) as new com.sun.star.beans.PropertyValue 
	pdfProperties(0).Name = "FilterName" 
	pdfProperties(0).Value = "calc_pdf_Export" 
[COLOR="Gray"]	rem - path and extension[/COLOR]
	dim path as string 
	path = "/Users/Shared/Vids/- Contents (2print)/" + dayFormatted
	dim extension as string 
	extension = ".pdf" 
[COLOR="Gray"]	rem - string containing protocol, path and filename[/COLOR]
	dim pdfurl as string 

[COLOR="Gray"]	rem - sheet's number[/COLOR]
	args0(0).Name = "Nr"
[COLOR="Gray"]	rem : "args0(0).Value"  will be set separately[/COLOR]

	for i=1 to ci_Sh_num 
		args0(0).Value = i
		dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args0())
		pdfurl = converttourl("file:///" + path + "/" + ThisComponent.getCurrentController.getActiveSheet.getName() + extension)
[COLOR="Gray"]		rem - Export PDF[/COLOR]

[COLOR="Gray"]		rem Variante 1 - Fehler, da Methode nicht verfügbar[/COLOR]
[COLOR="Red"][B]			ThisComponent.getCurrentController.getActiveSheet.storeToURL(pdfurl, pdfProperties())[/B][/COLOR]
[COLOR="Gray"]		rem Variante 2 - exportiert aber leider alles![/COLOR]
[COLOR="Red"][B]			ThisComponent.storeToURL(pdfurl, pdfProperties()) [/B][/COLOR]

	next i
End Sub ' Sub myPDFExport
 
Hallo Ernst42

ich habe keine Ahnung von Starbasic aber trotzdem einen Lösungsvorschlag:

Wenn du die besagte Seite programm-gesteuert in ein temporäres Dokument kopierst,
und dieses dann als PDF speicherst. Vielleicht geht's so...
 
Erst mal danke für die Antworten.

@duffguy:
Export in eine Datei ist ja durchaus das, was ich will... aber eben nur ein Tabellenblatt. Das das beim Export dann als PDF geschrieben wird, ist nur eine anzugebende Option...

@Tequilla: PDF-Druckertreiber beim Mac nachinstallieren??? So ein Ding ist schon integriert.
Oder meinst du noch einen nachinstallieren, um den dann als Drucker anzusprechen? Dann müsste das Ding aber Parameter (zu verwendender Dateiname) akzeptieren...


Na, kennt sich vielleicht doch noch jemand mit Starbasic aus???

Grüße
 
Ich hab noch an nem Mac gespielt :D
Wenn doch ein PDF Drucker installiert ist reicht es dann nicht damit die aktuelle Ansicht zu drucken?
 
Ich hab hier OOo Calc unter Windows. Wenn ich unter Datei die Option
Export als PDF anwähle, kriege ich den Dialog wie im Anhang.

Ich würde also mal den Makro Rekorder laufen lassen, diese Funktion ausführen,
und danach im generierten Code forschen, wie man das anstellen soll.

hth
 

Anhänge

  • calcpdf.png
    calcpdf.png
    28,1 KB · Aufrufe: 509
@Tequilla:
Die Möglichkeit des PDF-Drucks ist bei Mac OS X integriert. Ja.
Aber bei meiner Suche habe ich keine Möglichkeit in Starbasic (!) gefunden, um über einen 'PDF-Drucker' zu drucken. Der Druckdialog (scheint der Standarddialog des Systems zu sein) zweigt mit einem Export ab (Knopf "PDF") und weist nicht separat einen PDF-Drucker aus.

@duffguy
Der Druckdialog mit PDF ließ sich bei mir irgendwie nicht aufnehmen, und den PDF-Export hatte ich vor einiger Zeit schon für mich verworfen (warum auch immer) und jetzt nicht mehr daran gedacht, es nochmals auszuprobieren... ist jetzt nachgeholt. (Danke für den Tipp.)

Da ich ja ein einzelnes Tabellenblatt ausgeben will dachte ich mir nun, im Blatt alles zu markieren und im Bereich "Range" die Option "Selection" zu verwenden.
=> Im Dialog macht NeoOffice es sauber.
=> Lasse ich die aufgenommene Sub laufen (keine Veränderung gemacht), funzt es nicht...
Er exportiert immer nur das erste Blatt :cry::cry:
 
Lösung:

Hallo
ich hatte das Problem auch einmahl.
eine Saubere, Betriebssystem unabhängige Lösung ist:
Die Tabelle als "Druckbereich" festlegen und dann als pdf exportieren:
Hier der Code:
Im ersten "Sub Mein" muss der "TabellenMame" angepast werden. ansonsten ist es komplett einsatzbereit. einfach
das Sub Main aus einer calc datei ausführen und fertig.
Code:
REM  *****  BASIC  *****
'Copyright (c) 2011 Frieder Delor, Mailto: Einfach hier im Forum anschreiben :-)
'The funktion: GetPath()is originally from :Copyright (c) 2011 Volker Lenhardt
'This program is free software; you can redistribute it and/or modify it under 
'the terms of the GNU General Public License as published by the Free Software
'Foundation; either version 2 of the License, or (at your option) any later 
'version.

'This program is distributed in the hope that it will be useful, but WITHOUT 
'ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
'FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

'You should have received a copy of the GNU General Public License along with 
'this program; if not, write to the Free Software Foundation, Inc., 59 Temple 
'Place, Suite 330, Boston, MA 02111-1307 USA
'=======================================================
Sub Main
ExportToPDF ("Deine Tabellen Name")
end sub
Sub ExportToPDF (sTableNam As String)
  sPath = GetPath
  If sPath = "" Then
    MsgBox "Kein gültiges Verzeichnis.", 16, "Fehler"
    goTo Zeile1
  End If 
  Zeile0:
  sStandard = "PDF_Export_" & Format(Now, "hh-mm")& "Uhr_" & _
                    Format(Now,"dd.mm.yyyy") 
  sName=InputBox ("Bitte geben Sie einen Mamen" & Chr(10) & _
                  "für die DPF-Datei ein" , "PDF Name", sStandard )
  If sName="" Then
    nVar=MsgBox ("Sie haben keinen Name eingegeben. " & Chr(10) & _
                 "Bitte geben Sie einen Namen ein. " & Chr(10) & _
                 "Wenn Sie auf ""Abbrechen"" klicken, " & Chr(10) & _
                 "wird der export abgebrochen.", 1, "Fehler")
    If nVar=1 then 'OK wurde gedrückt
      goTo Zeile0
    Else
      goTo Zeile1
    End if  
  End if
  sFileName= sName & ".pdf"
  If FileExists(sPath & sFileName) then
  	nVar=MsgBox ("Die Datei existiert bereits. " & Chr(10) & _
                 "Soll die Datei überschrieben werden?. " & Chr(10) & _
                 Chr(10) & _
                 "Wenn Sie auf ""Abbrechen"" klicken, " & Chr(10) & _
                 "wird der export abgebrochen." & Chr(10) & _
                 "Wenn Sie auf ""Nein"" klicken," & Chr(10) & _
                 "können Sie einen anderen Namen wählen.", 3, "Fehler")
    Select Case nVar
    Case 2 'Abbrechen wurde gedrückt
      goTo Zeile1
    Case 6 'Ja wurde gedrückt
    Case 7 'Nein wurde gedrückt
      goTo Zeile0
    End Select 
  end if
  ThisComponent.addActionLock
  ThisComponent.LockControllers
  oDoc = ThisComponent
  oSheets = oDoc.Sheets
  oSheet1 =oDoc.Sheets.getByName(sTableNam) 
  Delete_PrintAreas
For n = 0 To oSheets.getCount - 1
  oSheet=oDoc.Sheets(n)
  if oSheet.Name= sTableNam Then 
  lEndCol= GetLastUsedColumn(oSheet1)
  lEndRow=GetLastUsedRow(oSheet1)
    Set_PrintAreas (n ,0 ,0 ,lEndCol ,lEndRow)
  End if
Next
  export_pdf(sPath & sFileName)  
  Delete_PrintAreas
  MsgBox "Das PDF wurden erfolgreich erstellt." , 0, "PDF Export"

  Zeile1:
  ThisComponent.UnlockControllers 
  ThisComponent.removeActionLock
End sub
'-------------------------------------------
sub Delete_PrintAreas 'Alle Druckbereich Löschen
  oDoc = ThisComponent
  oSheet = oDoc.Sheets(0)
  for n =0 to oDoc.Sheets.getCount - 1
    oDoc.Sheets(n).setPrintAreas(Array ())
  Next
end sub
'----------------------------------------
Sub Set_PrintAreas (nSheet As Integer,lStartCol As Long,_
lStartRow As Long,lEndCol As Long,lEndRow As Long) 'Drukbereich festlegen
  Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress
  oDoc = ThisComponent
  oSheet = oDoc.Sheets(nSheet)
  CellRangeAddress.Sheet = nSheet
  CellRangeAddress.StartColumn = lStartCol
  CellRangeAddress.StartRow = lStartRow
  CellRangeAddress.EndColumn = lEndCol
  CellRangeAddress.EndRow = lEndRow
  aPrintAreas()=Array (CellRangeAddress)
  oSheet.setPrintAreas(aPrintAreas())

End sub
'------------------------------------
Function GetLastUsedRow(oSheet as Object) As Integer 
  Dim oCell
  Dim oCursor
  Dim aAddress
  
  oCell = oSheet.getCellByPosition(0, 0)
  oCursor = oSheet.createCursorByRange(oCell)
  oCursor.gotoEndOfUsedArea(True)
  aAddress = oCursor.RangeAddress
  GetLastUsedRow = aAddress.EndRow
End Function
REM Returns the number of the last column 
'of a continuous data range in a sheet.
Function GetLastUsedColumn(oSheet as Object) As Long
  Dim oCell
  Dim oCursor
  Dim aAddress

  oCell = oSheet.getCellByPosition(0, 0)
  oCursor = oSheet.createCursorByRange(oCell)
  oCursor.gotoEndOfUsedArea(True)
  aAddress = oCursor.RangeAddress
  GetLastUsedColumn = aAddress.EndColumn
End Function
'----------------------------------
Function GetPath() As String
  Dim  oPathSettings, oFolderDialog
  Dim sPath As String

    oPathSettings = CreateUnoService("com.sun.star.util.PathSettings")
    sPath = oPathSettings.Work
    oFolderDialog = _
          CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")
    oFolderDialog.SetDisplayDirectory(sPath)
    If oFolderDialog.Execute() = _
          com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
      sPath = oFolderDialog.GetDirectory
    Else
      GetPath = ""
      Exit Function
    End If
  If Right(sPath, 1) <> "/" Then sPath = sPath & "/"
  GetPath = sPath
End Function 
'------------------------------------
sub export_pdf (sFileName AS String)

  dim args1(1) as new com.sun.star.beans.PropertyValue

  args1(0).Name = "ExportFormFields" 'just show the contents of the Form.Fields
  args1(0).Value= True
  args1(1).Name = "Printing" ' you don't need that.
  args1(1).Value= 0
'hier können noch weiter Optionen eingegeben werden

  dim args2(2) as new com.sun.star.beans.PropertyValue

  args2(0).Name = "FilterName"
  args2(0).Value = "calc_pdf_Export"
  args2(1).Name = "FilterData"
  args2(1).Value = args1
  args2(2).Name = "SelectionOnly" 'Das bewirkt, 
'dass nur der ausgewählte Druckbereich Exporrtiert wird.
  args2(2).Value = true

  ThisComponent.storeToURL(sFileName,args2())
end sub

Gruß
Frieder Delor
 
Zuletzt bearbeitet:
ot:
Hallo, herzlich willkommen und danke für Deinen Beitrag :)
Vielleicht solltest Du im obigen Text Deine E-Mail-Adresse unkenntlich machen?
Spambots grasen gerne Foren ab und sammeln die Adressen ein.
 
(So, nach einiger Abwesenheit zurückgekehrt...)

Danke erst mal an Wurzelmanager,
der sich nicht nur die Mühe gemacht hat, in einem schon leicht angestaubten Thread einen Lösungsvorschlag beizutragen,
sondern der auch daran gedacht hat, leicht angestaubte Threadersteller per PN auf seine Antwort hinzuweisen... :D

Besonders vorteilhaft:
Ich hatte bisher auch noch keine echte Lösung zu dem beschriebenen Problem gefunden.

Also werde ich mich in den nächsten Tagen hinsetzen und deinen Vorschlag genauestens unter die elektronische Lupe nehmen, versprochen.
Und dann gibt's auch ein (technisches) Feedback.

Danke und Grüße
 
Oben