PDFBox 使用 link/reference 创建声音对象到外部 mp3 或 wav 文件
PDFBox creating Sound object with link/reference to external mp3 or wav file
我正在使用基于 java 的开源 PDFBox 编写一个实用应用程序来转换包含 'Hyperlink to open an mp3 file' 的 PDF 文件以将其替换为声音对象。
我使用了 PDFBox API,因为它看起来足够成熟,可以使用 Sound 对象。我可以阅读 PDF 文件并参考 mp3 找到 hyperlink。但是我无法用声音对象替换它。我创建了声音对象并与动作关联,但它不起作用。我想我遗漏了一些重要的部分如何使用 PDActionSound 对象创建 Sound 对象。是否可以使用 PDFBox 引用外部 wav 文件 API?
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)并成功添加到link?
说到成熟,那部分从来没有用过,现在我仔细看了一下代码,我觉得还有一些工作要做......请试试这个,我用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 秒。您应该听到的声音是 "I am Al Bundy"。我尝试使用 MP3,但没有成功。在谷歌搜索时,我发现一些文本说只支持 "old" 格式(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) 在 Adobe Acrobat 中,它只允许您 select 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 编写一个实用应用程序来转换包含 'Hyperlink to open an mp3 file' 的 PDF 文件以将其替换为声音对象。
我使用了 PDFBox API,因为它看起来足够成熟,可以使用 Sound 对象。我可以阅读 PDF 文件并参考 mp3 找到 hyperlink。但是我无法用声音对象替换它。我创建了声音对象并与动作关联,但它不起作用。我想我遗漏了一些重要的部分如何使用 PDActionSound 对象创建 Sound 对象。是否可以使用 PDFBox 引用外部 wav 文件 API?
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)并成功添加到link?
说到成熟,那部分从来没有用过,现在我仔细看了一下代码,我觉得还有一些工作要做......请试试这个,我用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 秒。您应该听到的声音是 "I am Al Bundy"。我尝试使用 MP3,但没有成功。在谷歌搜索时,我发现一些文本说只支持 "old" 格式(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) 在 Adobe Acrobat 中,它只允许您 select 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);
}