Strona 1 z 1

LibbreOffice Draw zapis pliku z odpowiednią nazwą

: czw mar 03, 2022 10:17 pm
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

Re: LibbreOffice Draw zapis pliku z odpowiednią nazwą

: pt mar 04, 2022 12:28 am
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.

Re: LibbreOffice Draw zapis pliku z odpowiednią nazwą

: pt mar 04, 2022 1:19 am
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

Re: LibbreOffice Draw zapis pliku z odpowiednią nazwą

: pt mar 04, 2022 4:38 pm
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

Re: LibbreOffice Draw zapis pliku z odpowiednią nazwą

: sob mar 05, 2022 12:16 pm
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 .