java - PDFBox 使用外部 mp3 或 wav 文件的链接/引用创建 Sound 对象

标签 java pdf pdfbox javasound

我正在编写一个实用程序应用程序,使用基于开源java的PDFBox来转换包含“打开mp3文件的超链接”的PDF文件,以将其替换为声音对象。

我使用了 PDFBox API,因为它似乎足够成熟,可以与 Sound 对象一起使用。我可以阅读 PDF 文件并找到引用 mp3 的超链接。但我无法用声音对象替换它。我创建了声音对象并与操作关联,但它不起作用。我认为我缺少一些重要的部分如何使用 PDActionSound 对象创建 Sound 对象。是否可以使用 PDFBox API 引用外部 wav 文件?

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)并成功添加到链接?

最佳答案

说到成熟,那部分从未被使用过,现在我仔细查看了代码,我认为还有一些工作要做...请尝试这个,我在阅读了 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 文件,并且您必须了解它们的详细信息。开始时大约丢失了 1/2 秒。您应该听到的声音是“我是 Al Bundy”。我尝试用MP3但没有成功。在谷歌搜索时,我发现一些文本说仅支持“旧”格式(wav、aif 等)。我确实找到了另一种播放声音的方法(“Renditions”),甚至可以与 another product 中的嵌入式 mp3 一起使用。 ,但 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);

2016 年 7 月 9 日更新:

我们在 PDFBox 邮件列表上讨论了这个问题,感谢 Gilad Denneboom,我们还知道了两件事: 1) 在 Adob​​e Acrobat 中,它只允许您选择 WAV 或 AIF 文件 2) Gilad Denneboom 的代码 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);
}

关于java - PDFBox 使用外部 mp3 或 wav 文件的链接/引用创建 Sound 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36749927/

相关文章:

java - 使用 PDFBox 搜索单词的程序

pdf - 计算pdf中(Td,TD,Tm,cm,T*)内容流的确切位置?

java - 在构造函数后面有一个覆盖方法的部分的 Java 语法是什么?

java - 嵌套的异常是java.lang.VerifyError : Bad return type + getProfiler()Lcom/orientechnologies/common/profiler/OProfiler; @4: areturn

java - @Pattern with Unicode script\\p{L}* 不起作用

python - 从 Python 将 PDF 作为附件上传到 Salesforce 对象

java - 为 JButton 设置背景颜色

javascript - PDF 可 window 口浏览器兼容性

c# - 在 PDF 文件中添加或获取附件文件

PDFBox 提取段落