Estrarre i dati audio, MIDI e video da un file PDF

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca

Un file PDF può contenere anche autonomi dati audio, MIDI e video [nota 1], che possono essere estratti per ricostruire separatamente il formato di file corrispondente.

Estrarre i dati audio da un file PDF

Mostriamo un possibile codice, con il quale potranno essere raccolti i dati audio, presenti nel file PDF, di formato MP3, OGG e WAV, per creare il corrispondente file audio indipendente:

Public Sub Main()

 Dim s, id As String
 Dim mp3, ogg, wav, n, i As Integer

 s = File.Load("/percorso/del/file.pdf")

 n = InStr(s, "EmbeddedFile")

 mp3 = InStr(s, "ID3", n)
 If mp3 == 0 Then
   If InStr(s, "\xFF\xFB\x92") > 0 Then mp3 = InStr(s, "\xFF\xFB\x92")
   If InStr(s, "\xFF\xFB\x93") > 0 Then mp3 = InStr(s, "\xFF\xFB\x93")
 Else 
   id = "mp3"
   i = mp3
 Endif

 ogg = InStr(s, "Ogg", n)
 If ogg > 0 Then 
   id = "ogg"
   i = ogg
 Endif 

 wav = InStr(s, "WAVEfmt ", n)
 If InStr(s, "WAVEfmt ", n) * InStr(s, "RIFF", wav - 8) > 0 Then
   id = "wav"
   i = wav - 8
 Endif

' Ottiene il valore della quantità dei dati audio dichiarato nel file PDF:
 n = Val(Scan(Mid(s, n, i - n), "*Length * *")[1])

' Con i byte-dati estratti crea un file audio indipendente:
 File.Save("/tmp/audio." & id, Mid(s, i, n))
 
End


Estrarre i dati MIDI da un file PDF

Mostriamo un possibile codice, con il quale potranno essere raccolti i dati MIDI, per creare un file MIDI indipendente:

Public Sub Main()

 Dim s As String
 Dim i, n As Integer

 s = File.Load("/percorso/del/file.pdf")

 i = InStr(s, "MThd")
 n = RInStr(s, "Length", i)
' Ottiene il valore della quantità dei dati MIDI dichiarato nel file PDF:
 n = Val(Scan(Mid(s, n, i - n), "*Length * *")[1])

' Con i byte-dati estratti crea un file MIDI indipendente:
 File.Save("/tmp/MIDI.mid", Mid(s, i, n))

End


Estrarre i dati video da un file PDF

Mostriamo un possibile codice, con il quale potranno essere raccolti i dati video, presenti nel file PDF, di formato ASF, AVI, MOV e MP4, per creare il corrispondente file video indipendente:

Public Sub Main()

 Dim s, id As String
 Dim asf, avi, mov, mp4, n, i As Integer
 
 s = File.Load("/percorso/del/file.pdf")
 
 n = InStr(s, "EmbeddedFile")
 
 If InStr(s, "ftypmp42", n) > 0 Then mp4 = InStr(s, "ftypmp42", n)
 If InStr(s, "ftypisom", n) * InStr(s, "mp41", InStr(s, "ftypisom", n)) > 0 Then mp4 = InStr(s, "ftypisom", n)
 If mp4 * InStr(s, "mp4", mp4) > 0 Then 
   i = mp4 - 4
   id = "mp4"
 Endif

 avi = InStr(s, "AVI LIST", n)
 If avi > 0 Then
   i = avi - 8
   id = "avi"
 Endif

 i = InStr(s, "ftypqt", n)
 If i > 0 Then 
   i = i - 4
   id = "mov"
 Endif

 asf = InStr(s, "0&\xB2u\x8Ef\xCF\x11", n)
 If asf > 0 Then 
   i = asf
   id = "asf"
 Endif

' Ottiene il valore della quantità dei dati video dichiarato nel file PDF:
 n = Val(Scan(Mid(s, n, i - n), "*Length * *")[1])

' Crea il file video:
 File.Save("/tmp/video." & id, Mid(s, i, n))

End


Note

[1] Per inserire i dati di un qualsiasi file all'interno di un file PDF, si può utilizzare nel Terminale il comando "pdfattach ":
Vedi: https://www.mankier.com/1/pdfattach