LibbreOffice Draw zapis pliku z odpowiednią nazwą

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
MichalElo
Posty: 8
Rejestracja: czw mar 03, 2022 9:26 pm

LibbreOffice Draw zapis pliku z odpowiednią nazwą

Post autor: MichalElo »

Dzień dobry wszystkim,
W LibreOffice Draw potrzebuje ustawić makro, które eksportuje otworzony wcześniej i edytowany plik pdf do wybranej przeze mnie lokalizacji. Przykład: Użytkownik otwiera plik PDF za pomocą LO Draw, edytuje go, uruchamia makro które eksportuje plik do PDFa i zapisuje go w konkretnej lokalizacji z identyczną nazwą pliku taką jak otwierany PDF. Jestem laikiem jeśli chodzi o makra ale coś z pomocą LO calc i google napisałem:

Kod: Zaznacz cały

sub Main
rem-------
rem define variables
dim document as object
dim dispatcher as object
dim Filename
rem-----------
rem get acces to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Sheet = ThisComponent.getCurrentController.getActiveSheet()
FileName = ThisComponent.getCurrentController.getActiveSheet.Name
rem-------------
dim args1(2) as new com.sun.star.beans.PropertyValue

args1(0).Name = "URL"
args1(0).Value = "file:///C:/Users/i tak dalej/" & filename
args1(1).Name = "FilterName"
args1(1).Value = "draw_pdf_Export"
args1(2).Name= "FilterData"
args1(2).Value = Array(Array("UseLosslessCompression" i tu dalej ustawienia pdf które po prostu zarejestrowałem))
dispatcher.executeDispatch(document, ".uno:ExportToPDF", "", 0, args1())
end sub
To makro działa w calc , ale też źle bo jak sama komenda w makru wskazuje zapisuje plik z nazwą arkusza, a nie pliku. W draw też działa bez komend "sheet" i "filename" i muszę ustawić konkretną nazwę eksportowanego pliku co powoduje problem bo chce żeby w jednym folderze było kilkanaście plików, a teraz te pliki się po prostu nadpisują. Ostatecznie jeśli nie można wyciągnąć nazwy otwieranego /edytowanego pliku pdf zależy mi na tym aby każdy plik zapisywany był z inną nazwą poprzez dodanie godziny na przykład. Uprzejmie proszę o pomoc
Ostatnio zmieniony pt mar 04, 2022 12:09 am przez Rafkus, łącznie zmieniany 1 raz.
Powód: Dodane znaczniki kodu
LibreOffice 7.2 / windows 10 pro
Jan_J
Posty: 4583
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: LibbreOffice Draw zapis pliku z odpowiednią nazwą

Post autor: Jan_J »

Scieżkę zapisu wydobędziesz z dokumentu, w tym przypadku:

Kod: Zaznacz cały

filename = ThisComponent.getLocation()
jest to bieżący dokument.

Jeśli chcesz na podstawie takiej ścieżki urobić ścieżkę dla zapisu nowego pliku, z innym rozszerzeniem i znacznikiem czasu, można to zrobić następująco:

Kod: Zaznacz cały

dokument = thisComponent()
sciezka = dokument.getLocation()
czas = now()
nowasciezka = left(sciezka, len(sciezka) - 4) & "-" & czas & ".pdf"
Jest to jedynie szkic pomysłu, bo
  • zakładam tu że rozszerzenie w oryginalnej ścieżce składało się z 3 znaków,
  • ścieżka opisująca położenie pliku jest w całości zachowana. Jeśli tak ma nie być, odetnij funkcją right wszystko, co znajduje się na lewo od ostatniego wystąpienia separatora "/", razem z nim,
  • dołącz do tworzonej nazwy przedrostek postaci "file:///" & nowa_ścieżka,
  • znacznik czasu w pełnej rozciągłości wchodzi do tekstu nowej nazwy pliku,
  • rozszerzenie nowe na sztywno jest ustawiane jako ".pdf",
ale w zarysie wszystko jest podane.

Ad Twoje oczekiwania, dodam zgryźliwą uwagę: jeśli żądasz, by
zapisuje go w konkretnej lokalizacji z identyczną nazwą pliku taką jak otwierany PDF
to skutek
teraz te pliki się po prostu nadpisują
jest jak najbardziej oczekiwany.
Natomiast pomysł,
aby każdy plik zapisywany był z inną nazwą poprzez dodanie godziny na przykład
jest z Twoim wstępnym założeniem po prostu niezgodny.
Więcej precyzji zatem. Ale mam nadzieję, że wskazówka zamieszczona wyżej pomoże.
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Rafkus
Posty: 527
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: LibbreOffice Draw zapis pliku z odpowiednią nazwą

Post autor: Rafkus »

Edytowanie PDF w DRAW... łał, czemu mi takie pomysły nie wpadają do głowy ;)
W każdym razie służę paroma linijkami kodu:

Kod: Zaznacz cały

Dim adres, nazwa, wersja as string
adres = ThisComponent.getURL()   'zmienna adres otrzymuje adres otwartego pliku np: file:///C:/Users/User/Desktop/1033271.pdf
nazwa = ThisComponent.getTitle()    'zmienna nazwa otrzymuje otwartego pliku nazwę  np: 1033271.pdf
nazwa = Left(nazwa, LEN(nazwa) - 4)   'z nazwy są wyrzucone ostatnie 4 znaki,  otrzymujesz np: 1033271
wersja = format(now, "YYYY-MM-DD""_""hhmm")  'tak utworzyłem wersję, otrzymałem tekst w postaci rok-miesiąc-dzień_godzinaminuty
REM  plik ma być zapisany jednak w innej lokalizacji:  
adres = "C:/AJednakTutaj/" & nazwa & "_" & wersja & ".pdf"     'dane są łączone w jeden ciąg, otrzymasz adres: C:/AJednakTutaj/1033271_2022-03-04_0015.pdf
adres = ConvertToURL(adres)
Jęśli od początku chcesz ten plik wyeksportować do nowej lokalizacji to te polecenie jest zbędne: adres = ThisComponent.getURL()
Powyższy kod możesz wkleić zamiast tych linijek w twoim makrze:

Kod: Zaznacz cały

Sheet = ThisComponent.getCurrentController.getActiveSheet()
FileName = ThisComponent.getCurrentController.getActiveSheet.Name
i nieco niżej popraw wartość args1(0).Value na:

Kod: Zaznacz cały

args1(0).Value = adres
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2361
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: LibbreOffice Draw zapis pliku z odpowiednią nazwą

Post autor: Jermor »

Można pominąć dispatcher i sam zapis pliku zrealizować takim sposobem:

Kod: Zaznacz cały

....
Dim args(0) as new com.sun.star.beans.PropertyValue
args(0).Name = "FilterName"
args(0).Value = "draw_pdf_Export"
ThisComponent.storeToURL(adres,args()) 
End Sub
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
MichalElo
Posty: 8
Rejestracja: czw mar 03, 2022 9:26 pm

Re: LibbreOffice Draw zapis pliku z odpowiednią nazwą

Post autor: MichalElo »

Dziekuję za szybkie odpowiedzi, sprawdzę pewnie w poniedziałek wasze kody i dam znać. :super:
Działa skorzystałem z kodu rafkusa. Jeszcze trochę posiedzę w tym programie wiec pozostałe.odpowiedzi mogą być dla mnie przydatne w przyszłości .
LibreOffice 7.2 / windows 10 pro
ODPOWIEDZ