PDF内嵌入视频
背景
出于安全性、新技术兴起、移植性不好等原因,Adobe于2020年12月31日停止了对Flash Player的支持,LaTeX中media9宏包中的一些操作在更高版本的Acrobat Reader DC中无法实现,比如内嵌视频,但一些大佬设计了一些方案,能够成功在PDF里嵌入视频。
声明
实际上如果想把PDF发给目标客户,然后在一些文字难以说明的场合让客户看到操作视频,目前比较好的解决方案是引用链接,而不是内嵌视频,即把视频上传到b站等视频网站上,然后再PDF引用跳转链接。
需要的东西
Foxit PDF Reader
Tex发行版
VScode(安装latex workshop插件)或者其他编辑器如jetbrain系列(安装texify插件)等
embed_video.tex
enablePlayerControls.reg
embed_video.tex
文件中的代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \embedvideo{<poster or text>}{<video file (MP4+H264)>}
% \embedvideo*{...}{...} % auto-play
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage [bigfiles] { pdfbase}
\ExplSyntaxOn
\NewDocumentCommand\embedvideo { smm}{
\group_begin:
\leavevmode
\tl_if_exist:cTF { file_ \file_mdfive_hash:n { #3}}{
\tl_set_eq:Nc\video { file_ \file_mdfive_hash:n { #3}}
}{
\IfFileExists { #3}{}{ \GenericError {}{ File~`#3'~not~found}{}{}}
\pbs_pdfobj:nnn {}{ fstream}{{}{ #3}}
\pbs_pdfobj:nnn {}{ dict}{
/Type/Filespec/F~(#3)/UF~(#3)
/EF~<</F~\pbs_pdflastobj: >>
}
\tl_set:Nx\video { \pbs_pdflastobj: }
\tl_gset_eq:cN { file_ \file_mdfive_hash:n { #3}} \video
}
%
\pbs_pdfobj:nnn {}{ dict}{
/Type/RichMediaInstance/Subtype/Video
/Asset~\video
/Params~<</FlashVars (
source=#3&
skin=SkinOverAllNoFullNoCaption.swf&
skinAutoHide=true&
skinBackgroundColor=0x5F5F5F&
skinBackgroundAlpha=0
)>>
}
%
\pbs_pdfobj:nnn {}{ dict}{
/Type/RichMediaConfiguration/Subtype/Video
/Instances~[\pbs_pdflastobj: ]
}
%
\pbs_pdfobj:nnn {}{ dict}{
/Type/RichMediaContent
/Assets~<<
/Names~[(#3)~\video ]
>>
/Configurations~[\pbs_pdflastobj: ]
}
\tl_set:Nx\rmcontent { \pbs_pdflastobj: }
%
\pbs_pdfobj:nnn {}{ dict}{
/Activation~<<
/Condition/\IfBooleanTF { #1}{ PV}{ XA}
/Presentation~<</Style/Embedded>>
>>
/Deactivation~<</Condition/PI>>
}
%
\hbox_set:Nn\l_tmpa_box { #2}
\tl_set:Nx\l_box_wd_tl { \dim_use:N\box_wd:N\l_tmpa_box }
\tl_set:Nx\l_box_ht_tl { \dim_use:N\box_ht:N\l_tmpa_box }
\tl_set:Nx\l_box_dp_tl { \dim_use:N\box_dp:N\l_tmpa_box }
\pbs_pdfxform:nnnnn { 1}{ 1}{}{}{ \l_tmpa_box }
%
\pbs_pdfannot:nnnn { \l_box_wd_tl }{ \l_box_ht_tl }{ \l_box_dp_tl }{
/Subtype/RichMedia
/BS~<</W~0/S/S>>
/Contents~(embedded~video~file:#3)
/NM~(rma:#3)
/AP~<</N~\pbs_pdflastxform: >>
/RichMediaSettings~\pbs_pdflastobj:
/RichMediaContent~\rmcontent
}
\phantom { #2}
\group_end:
}
\ExplSyntaxOff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
enablePlayerControls.reg
文件中的代码
REGEDIT4
[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Adobe\Acrobat Reader\DC\FeatureState]
"HonorControls"=dword:00000001
Foxit PDF Reader下载链接
点这里
Texlive
下载链接点这里
操作步骤
上述文件(软件)准备齐全后,新建一个文件夹,用来存放嵌入文件embed_video.tex
、测试文件test.tex
、图片文件
、pdf文件
等等,为了方便说明,比如说新建了一个叫example
的文件夹,路径是D:\example
在D:\example
路径下创建enablePlayerControls.reg
文件和embed_video.tex
文件,embed_video.tex
文件创建相对简单,在VScode里选择New File, 命名为embed_video.tex
, 然后把上面的代码 复制粘贴进去就可以了,或者用百度网盘链接下载embed_video.tex到example
文件夹里;enablePlayerControls.reg
文件创建和运行要麻烦一些,跟随以下步骤
打开记事本,将enablePlayerControls.reg文件中的内容复制粘贴进去,点击保存,尽量选择一个英文路径保存,保存时文件名为enablePlayerControls.reg
,文档类型
注意选择所有文件(all file)
而不是文本文档(txt file)
双击运行enablePlayerControls.reg
文件,应该会弹出一个窗口说需要授予管理员权限,点确定
写测试文件
VScode(或其他编辑器)新建一个文件test.tex,复制粘贴如下代码:
\documentclass { article}
\usepackage { graphicx} /*play on click的时候会有一个封面,这个包用来加载封面图*/
\input { embed_ video.tex}
\begin { document}
\section { autoplay}
\embedvideo* { \includegraphics [page=1] { example.png}}{ example_ video.mp4}
\newpage
\section { play on click}
\embedvideo { \includegraphics [page=1] { example2.png}}{ example_ video2.mp4}
\end { document}
注意把example.png
example2.png
example_video.mp4
example_video2.mp4
替换成自己真实的文件名,同时embed_video.tex
和example.png
example2.png
example_video.mp4
example_video2.mp4
都在同一个文件夹下,最后编译,再用Foxit PDF Reader打开就可以了
参考网址
1StackExchange
声明:以上的代码来自于StackExchange大佬AlexG,本人只是做了整理说明