2016-04-20 5 views
1

Я пишу приложение-утилиту с использованием открытого PDF-кода на основе Java с открытым исходным кодом для преобразования PDF-файла, содержащего «Гиперссылку, чтобы открыть mp3-файл», чтобы заменить его звуковым объектом.PDFBox, создающий звуковой объект со ссылкой/ссылкой на внешний mp3-файл или wav-файл

Я использовал API PDFBox, так как он кажется достаточно зрелым, чтобы работать со звуковым объектом. Я мог бы прочитать PDF-файл и найти гиперссылку со ссылкой на mp3. Но я не могу заменить его звуковым объектом. Я создал звуковой объект и связал его с действием, но он не работает. Я думаю, что мне не хватает важной роли, как создать объект Sound, используя объект PDActionSound. Можно ли обращаться к внешнему wav-файлу с помощью API-интерфейса PDFBox?

for (PDPage pdPage : pages) { 
    List<PDAnnotation> annotations = pdPage.getAnnotations(); 
    for (PDAnnotation pdAnnotation : annotations) { 
     if (pdAnnotation instanceof PDAnnotationLink) { 
      PDAnnotationLink link = ((PDAnnotationLink) pdAnnotation); 
      PDAction action = link.getAction(); 
      if (action instanceof PDActionLaunch) { 
       PDActionLaunch launch = ((PDActionLaunch) action); 
       String fileInfo = launch.getFile().getFile(); 
       if (fileInfo.contains(".mp3")) { 
       /* create Sound object referring to external mp3*/ 
       //something like 
       PDActionSound actionSound = new PDActionSound(
             soundStream); 
       //set the ActionSound to the link. 
       link.setAction(actionSound); 
       } 
      } 
     } 
    } 
} 

Как создать звуковой объект (PDActionSound) и успешно добавить ссылку?

ответ

1

Говоря о зрелом возрасте, эта часть никогда не использовалась, и теперь, когда я более подробно рассмотрел код, я думаю, что некоторая работа еще предстоит сделать ... Попробуйте это, я создал это с помощью PDFBox 2.0 после прочтения спецификация в формате PDF:

PDSimpleFileSpecification fileSpec = new PDSimpleFileSpecification(new COSString("/C/dir1/dir2/blah.mp3")); // see "File Specification Strings" in PDF spec 
COSStream soundStream = new COSStream(); 
soundStream.createOutputStream().close(); 
soundStream.setItem(COSName.F, fileSpec); 
soundStream.setInt(COSName.R, 44100); // put actual sample rate here 
PDActionSound actionSound = new PDActionSound(); 
actionSound.getCOSObject().setItem(COSName.getPDFName("Sound"), soundStream)); 
link.setAction(actionSound); // reassign the new action to the link annotation 

Редактировать: как указано выше не работает, вот альтернативное решение, указанное в комментариях. Файл встроен. Он работает только с файлами .WAV, и вы должны знать их детали. Около половины секунд теряются в начале. Звук, который вы должны услышать, это «Я Аль Банди». Я пробовал с MP3 и не получилось. Во время поиска в Google я нашел несколько текстов, в которых говорится, что поддерживаются только «старые» форматы (wav, aif и т. Д.). Я нашел еще один способ воспроизвести звуки («Renditions»), которые даже работали со встроенными mp3 в another product, но сгенерированная структура в PDF еще сложнее.

COSStream soundStream = new COSStream(); 
OutputStream os = soundStream.createOutputStream(COSName.FLATE_DECODE); 
URL url = new URL("http://cd.textfiles.com/hackchronii/WAV/ALBUNDY1.WAV"); 
InputStream is = url.openStream(); 
// FileInputStream is = new FileInputStream(".....WAV"); 
IOUtils.copy(is, os); 
is.close(); 
os.close(); 
// See p. 506 in PDF spec, Table 294 
soundStream.setInt(COSName.C, 1); // channels 
soundStream.setInt(COSName.R, 22050); // sampling rate 
//soundStream.setString(COSName.E, "Signed"); // The encoding format for the sample data 
soundStream.setInt(COSName.B, 8); // The number of bits per sample value per channel. Default value: 8 
// soundStream.setName(COSName.CO, "MP3"); // doesn't work 
PDActionSound actionSound = new PDActionSound(); 
actionSound.getCOSObject().setItem(COSName.getPDFName("Sound"), soundStream); 
link.setAction(actionSound); 

Update 9.7.2016:

Мы обсуждали это в списке рассылки PDFBox, и благодаря Гилада Деннебоом мы знаем, еще две вещи: 1) в Adobe Acrobat он позволяет только выбрать либо WAV или AIF файлы 2) код Гилада Деннебоого с MP3SPI конвертировать MP3 в сырье:

private static InputStream getAudioStream(String filename) throws Exception { 
    File file = new File(filename); 
    AudioInputStream in = AudioSystem.getAudioInputStream(file); 
    AudioFormat baseFormat = in.getFormat(); 
    AudioFormat decodedFormat = new AudioFormat(
     AudioFormat.Encoding.PCM_UNSIGNED, 
     baseFormat.getSampleRate(), 
     baseFormat.getSampleSizeInBits(), 
     baseFormat.getChannels(), 
     baseFormat.getChannels(), 
     baseFormat.getSampleRate(), 
     false); 
    return AudioSystem.getAudioInputStream(decodedFormat, in); 
} 
+0

Спасибо за ваш ответ. Имеет ли метод actionSound метод setItem? какую версию API PDXBox вы используете? –

+0

Я использую 2.0. Я забыл добавить getCOSObject(), извините, я отредактировал свой ответ. (Если ваша проблема будет решена, я позабочусь о том, чтобы в будущем был добавлен метод setSound()). –

+0

Спасибо @ Тилман К сожалению, он еще не решен. У меня есть еще один звуковой объект (добавлено вручную). Когда я воспроизвожу этот звуковой объект, он воспроизводит звук и нажимая на программно созданную звуковую аннотацию в соответствии с вашим решением, она останавливает воспроизведение звука. Но он не воспроизводит файл, который я прикреплял, используя .. 'PDSimpleFileSpecification fileSpec = new PDSimpleFileSpecification (« D: \ temp.wav »);' Я использую PDXBox 2.0.0 RC3 API –

Смежные вопросы