Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 5. 5. 2019 11:07:27

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

zjistit makrem zda je pdf otevřené-VYŘEŠENO

Ahoj. Vytvářím faktury a ukládám makrem jako pdf. Vše běží celkem v pohodě. V případě že faktura (soubor PDF) již existuje tak se přepíše novým exportem bez ptaní, což mi vyhovuje. Problém nastane pokud je PDF zrovna otevřeno. Program skončí chybou. Nemáte někdo v zásobě prográmek který by zjistil zda PDF není náhodou otevřené a pokud ano, program by se jen pozastavil se žádostí o zavření PDF.


Napdá mě akorát obecné řešení pomocí "on error goto", kde by se vyzvalo k něčemu jako "možná je to a to PDF otevřeno ..." chyba ale může být i jiného druhu :-). Raději bych konkrétní zjištění, tedy následně hlášku: "Ten a ten soubor je otevřen, zavřete jej prosím ..."

Editoval ludviktrnka (6. 5. 2019 18:53:57)


LibreOffice 5.4.

Offline

#2 5. 5. 2019 12:08:58

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Já bych doporučil testovat pomocí IsMissing popřípadě OnError GoTo > vytvořit v takovém případě název + k názvu přidat nejlépe datový otisk. Testovat lze soubory otevřené pomocí OPEN což ale nemusí fungovat při manuálním otevření a navíc to nemusí fungovat u PDF. PDF se otevírá pomocí DRAW takže zde mohou být problémy s nastartováním aplikace.
     IsMissing ukáže zda soubor existuje ale nevím jestli při tom lze uvažovat o tom zda sice existuje, ale je již otevřený. Při tomtom otestujete oba případy. Tedy otestovat jak zavřený, tak otevřený soubor PDF. Potom se dá postavit reakce.
     Otestujte nejprve zda zabere spojení IsError (OPEN()) protože i tento příkaz Open vrací chybu pokud je již otevřený.

nápověda napsal(a)

Sub ExampleWorkWithAFile
Dim iNumber As Integer
Dim sLine As String
Dim aFile As String
Dim sMsg As String
    aFile = "c:\data.txt"
    iNumber = Freefile
    Open aFile For Output As #iNumber
    Print #iNumber, "Toto je řádek textu"
    Print #iNumber, "Toto je další řádek textu"
    Close #iNumber
    iNumber = Freefile
    Open aFile For Input As iNumber
    While Not eof(iNumber)
        Line Input #iNumber, sLine
        If sLine <>"" Then
            sMsg = sMsg & sLine & chr(13)
        End If
    Wend
    Close #iNumber
    MsgBox sMsg
End Sub


     Nevím celkem jestli je to na síti, nebo jestli může někdo přistupovat ze vzdáleného stroje, ale vždy bych mimo označené "kopie" vytvořil protokol pokud ukládáte lavinovitě dávky (například eshop ap.). Situace může být častá a s těžko predikovatelným stavem. Takže někdy je potřebné udělat manuálně nápravu. To bez protokolu dost dobře nejde.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 5. 5. 2019 12:34:32

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Tak jsem hledal v cizích fórech a je to možné udělat pomocí "lock". Otevřený soubor je totiž také uzamčený. podívejte se sem Test otevřeného souboru. Návodů jsem našel víc a celkem dost podobné, ale nevím jestli to bude fungovat pro PDF.
     Uvádím jedno z maker :

Sub CheckIfFileIsLocked()
Dim StrPath, StrFile, StrFileLocked As String
StrPath = "C:/"
StrFile = "Test.odt"
StrFileLocked  = StrPath & ".~lock." & StrFile & "#"
If FileExists(StrFileLocked) Then
  MsgBox "File locked for editing by another user. Try again later.", 16
  Exit Sub
End If
End Sub

Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#4 5. 5. 2019 12:43:02

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

To se obávám že skoro nemá smysl zkoušet, soubor c:\.~lock.můjsoubor.pdf# žádný neexistuje, akrobat jej nevytváří, blokování přístupu probíhá na jiné úrovni. Tohle je jednoznačně na open dokument soubory, které vytváří soubory tohoto typu. Ale samozřejmě díky.


LibreOffice 5.4.

Offline

#5 5. 5. 2019 12:53:48

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

To máte pravdu - PDF je otevřené pod OS, ale dá se otevírat pomocí DRAW. A to se dá udělat. Makra k otevření existují. Mimo toho je možné testovat pomocí Shell. Ten pracuje s externími soubory. Ukázka volání externích programů :

Sub Start_Gimp
Shell("C:\Program Files\GIMP-2.2\bin\gimp-2.2.exe")
End Sub

Sub Start_Inkscape
Shell("C:\Program Files\Inkscape\inkscape.exe")
End Sub

Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#6 5. 5. 2019 13:09:53

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

To jo, jenže problém je že PDF je otevřeno normálně z nástrojů Windows a např. tato dávka

oSys = CreateUnoService("com.sun.star.system.SystemShellExecute")
oSys.execute(sDestUrl, "", 0)

nevrací u otveřeného PDF chybu, prostě jej jen otevře a pokud už otevřené je, tak už nic nedělá.

Zkusil jsem vysledovat tu chybovou hlášku a nakonec mám řešení jak jsem psal v otázce a sice přes on error goto, trošku specifikované chybou číslo "1", což nevím moc co znamená.

 z = 1
  
  zavrisoubor: 'ošetření chyb z příkazu on error goto
  if z=0 then
  		If Err = 1 Then
        	msgbox ("Zavři soubor:" & CHR(10) & sPATH & CHR(10) & "a stiskni OK",0,"Soubor je otveřený")
  		 	Resume souborzavren
  		else
  			msgbox ("Uf. Něco se stalo."& CHR(10) &_
  			"Error " & Err & ": " & Error$ & " (line : " & Erl & ")",0,"Ukončení")
  			Resume konec
  		end if
  end if

Editoval ludviktrnka (5. 5. 2019 13:11:38)


LibreOffice 5.4.

Offline

#7 5. 5. 2019 13:18:14

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Nefunguje mi ani když celý pokus o export zavřu do podmínky If(IsError(


If IsError(ThisComponent.storeToURL(ConvertToUrl(sPATH), podminka_exportu())) Then


I v tomto případě program skončí chybou.


LibreOffice 5.4.

Offline

#8 5. 5. 2019 13:42:24

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Příkaz IsMissing v tomto případě nechápu - resp. nevím jak použít. Zkusil jsem FileExists() ale to dává při otevřeném i zavřeném pdf stejný výsledek


Tož nahradil jsem FileExists příkazem IsMissing ... Funkce IsMissing je určena na zjišťování existence proměnné (asi), takže podmínka IsMissing(ConvertToUrl(sPATH)) = False je vždy pravdivá, protože sPATH je definována bez ohledu na existenci souboru (funkce nemá prostě se samotným souborem žádný vztah)

Editoval ludviktrnka (5. 5. 2019 14:17:23)


LibreOffice 5.4.

Offline

#9 5. 5. 2019 15:11:09

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Ty funkce IsMissing a IsError mají logický výstup - tedy True/False. Správně tedy by měly být použity jako If IsMissing(argument) = False (pozn. Missing, IsMissinng v překladu chybějící) Then.....
     Konkrétně IsMissing má možnost přidat ještě nepovinný argument (Optional) což IsError nemá. Uvažuji o použití Shellu, protože například MsgBox FileExists("C:\autoexec.bat") je prakticky shodný s Shell a vrací true/false. FileExists otestuje pouze existenci, ale IsMissing testuje přístup na objekt. Používá se to zejména u knihoven typu ".bas" a podobně.
     Takže také můžete pomocí Shellu zavolat prohlížeč PDF (zřejmě AdobeAcrobat.exe) a zavřít nejprve do FileExists a testovat v podmínce If. Také je možné prohledat adresář pomocí temp adresáře zda je pdf otevřené. Takže pokud existuje muže mít také zápis v Temporay, respektive Temp. To se dá snadno vyhledat tak, že si stáhnete odněkud pdf a zadáte nikoliv uložit, ale otevřít. Po otevření tento soubor vyhledáte až dostanete adresář kam se dočasně ukládá. Je to různé v různých OS.
     Následně tento adresář iterujete na existenci názvu který Vás zajímá. Takto by se to mělo najít "nepřímo". Samozřejmě problém by nastal když by to bylo na síti a Vy nemáte přístup admina. Tento postup jsem používal pro zaseklé soubory ODF které se už nehlásily v obnově. Ty však mají informaci jednak ve vlastním Temp a také v adresáři kde leží originál. Navíc jsem dříve pracoval více na Ubuntu a XP (32 bit) jsem měl jen na určité práce vedle takže ani nevím jak to mám nyní. Pracuji střídavě na W7 a a W10. Linux 64 jsem ještě nenainstaloval - musím koupit další mašinu :-(

Editoval neutr (5. 5. 2019 15:12:57)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#10 6. 5. 2019 18:39:54

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Tak světová komunita nakonec řešení našla. Dotaz jsem položil trochu jinak a sice, jak ukočit běžící proces a řešení je následovné:

shell("taskkill", 0, "/f /im AcroRd32.exe", True)

... jednoduché jak facka. Takto platí ovšem zřejmě jen pro windows, podrobnosti zde: https://docs.microsoft.com/en-us/window … s/taskkill

Nezjistím tedy zda je soubor otevřen ale v každém případě aplikaci zavřu, čímž zajistím hladký průběh.


LibreOffice 5.4.

Offline

#11 6. 5. 2019 19:03:35

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Hezky - ale nevzniká chyba když je Acrobat zavřený? A co když je to otevřeno v jiném prohlížeči? Tedy když to není na síti nebo sdíleno, tak to určitě zafunguje. Ale PDF je možné otevřít v každém browseru a nevím jestli může být zaseklý v programu který je odinstalovaný, nebo nefunkční. Takto se chovají například rozšíření pro Firefox které jsou systémem Mozilly (možná i jiné prohlížeče) zakázány a podobně.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#12 6. 5. 2019 19:10:03

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Když je acrobat zavřen tak se neděje nic, což je v pořádku. Na síti nepracuji, takže síťovou funkčnost vyzkoušet nemohu. Resp. i když otveřu PDF ze síťového umístění, stejně se otevře v lokálním Acrobatu, takže by to mělo fungovat stejně. Ale to mě jinak netrápí.


Do makra pak příkaz vložím mezi počáteční dotazy, které se objevují na začátku, takže uživatel může rozhodnout zda chce nebo nechce proces vypínat.


LibreOffice 5.4.

Offline

#13 4. 7. 2019 14:35:28

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 368

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Dnes mě napadlo zkusit ten soubor přejmenovat. Není to stopro řešení neboť některé programy neotevírají původní soubory ale udělají si kopie do svého tempu, nicméně s PDFky mi to pod FoxitReaderem funguje dobře, ten otevírá originály a otevřený originál by přejmenovat jít neměl.

sub testPrejmenovaniSouboru 'test na otevření souboru přejmenováním
	on local error goto chyba
	dim adresar$, soubor$, prefix$, s1$, s2$
	prefix="PREJMENOVANO-"
	adresar="d:/"
	soubor="tabulka-vzorova.pdf"
	s1=convertToUrl(adresar) & soubor
	s2=convertToUrl(adresar) & prefix & soubor
	NAME s1 AS s2 'přejmenuje na prefixPůvodníJméno
	NAME s2 AS s1 'přejmenuje zpátky na PůvodníJméno
	exit sub
chyba:
	if 1=msgbox(s1 & chr(13) & "se nepodařilo přejmenovat, nejpíš je otevřený." & chr(13) &  "Zavřít program?",17) then
		shell("taskkill", 0, "/f /im FoxitReader.exe", True)
	end if
end sub

Offline

#14 4. 7. 2019 15:18:17

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Super, to vypadá dobře. Díky za rozvoj tématu.


LibreOffice 5.4.

Offline

#15 3. 7. 2021 20:13:26

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 368

Re: zjistit makrem zda je pdf otevřené-VYŘEŠENO

Viděl jsem tady https://www.debugpoint.com/2015/08/expo … ing-macro/ že zkouší napřed otevřít PDF pro přidání. Ale když si nějaký program vytvoří kopii otevíraného souboru tak to také nedetekuje.

Sub jePDFotevrene 'zkusí PDF otevřít pro přidání a když je otevřené tak zahlásí chybu; když není otevřené tak jej bez úpravy ihned zavře
	on local error goto chyba
	dim path$
	path=ConvertToUrl("d:\test.pdf")
	Open path For Append As #1
	Close #1
	msgbox path & chr(13) & "OK"
	exit sub
chyba:
	msgbox path & chr(13) & "je otevřeno"
End Sub

Editoval kamlan (4. 7. 2021 12:08:21)

Offline

Zápatí