TeXでPDFに埋め込んだ数式情報の救出
2022-05-15(日)
LaTeXiTとかTeX2imgでPDFに埋め込んだTeXソースを拾い出したい。
結論から言うと TeX2imgはPyPDF2で読める。LaTeXiTは面倒過ぎて放棄。
tex2imgの場合
PyPDF2でPDFファイルを開いてページを取得する。 前提として1ページもので数式が出力されてるPDFの equation.pdf を扱う。
import PyPDF2
f = open('equation.pdf', 'rb')
reader = PyPDF2.PdfFileReader(f)
page = reader.getPage(0)
pageはPyPDF2._page.PageObject
だがdictと考えて良い。
In : page.keys()
Out: dict_keys(['/Type', '/Parent', '/Resources', '/Contents', '/MediaBox', '/Rotate', '/Annots', '/ArtBox', '/BleedBox', '/CropBox', '/TrimBox'])
みたいな感じで,注釈として'/Annots'
に入ってるので,ここを掘る。
In : page['/Annots']
Out: [IndirectObject(9, 0), IndirectObject(10, 0)]
のような感じでIndirectObject
のリストになっているので、とりあえず先頭の要素を指定してgetObject
で取得する。
In : page['/Annots'][0].getObject()
Out:
{'/Popup': {'/Parent': {...},
'/Type': '/Annot',
'/Subtype': '/Popup',
'/Rect': [4, 0, 132, 64]},
'/Type': '/Annot',
'/AP': {'/N': {'/Filter': '/FlateDecode',
'/Type': '/XObject',
'/Subtype': '/Form',
'/FormType': 1,
'/BBox': [0, 0, 0, 0],
'/Resources': {'/ProcSet': ['/PDF']}}},
'/Rect': [0, 0, 0, 0],
'/Contents': '%%TeX2img Document\n% LaTeX compiler: platex\n% DVI driver: dvipdfmx\n\\documentclass[fleqn,papersize]{jsarticle}\n\\usepackage{amsmath,amssymb}\n\\usepackage[dvipdfmx]{graphicx,color}\n\\pagestyle{empty}\n\\parindent = 0pt\n\n\\renewcommand{\\kanjifamilydefault}{\\gtdefault} \n% 日本語書体をゴシック体に\n\\renewcommand{\\familydefault}{\\sfdefault} \n% 欧文書体をHelveticaに\n\\setlength{\\textwidth}{100mm}\n\n\\begin{document}\n複素電圧$ \\dot{V}$や複素電流$ \\dot{I}$から瞬時電圧$v$や瞬時電流$i$を求めるには$\\sqrt{2} e^{j\\omega t} $を乗じた虚部を求めれば良い。\n\n\\begin{eqnarray*}\n\\mbox{複素電圧:} \\dot{V} &=& V e^{j0^\\circ} = V\\angle 0^\\circ = V \\dots (4.35) \\\\\n\\mbox{複素電流:} \\dot{I} &=& I e^{j\\theta } = I\\angle \\theta = I (\\cos \\theta + j\\sin \\theta) \\dots (4.36) \n\\end{eqnarray*}\nとすると\n\\begin{eqnarray*}\nv(t) &=& \\Im [ \\dot{V} \\times \\sqrt{2} e^{j\\omega t} ] = \\Im [ \\sqrt{2} V e^{j \\omega t}] \\\\\n& = & \\Im[ \\sqrt{2}V (\\cos \\omega t + j \\sin \\omega t ) ]\\\\\n& = & \\sqrt{2}V \\sin \\omega t = V_m \\sin \\omega t\\\\\ni(t) &=& \\Im [ \\dot{I} \\times \\sqrt{2} e^{j\\omega t} ] = \\Im [ \\sqrt{2} I e^{j \\theta} e^{j \\omega t}] = \\Im [ \\sqrt{2} I e^{j ( \\omega t + \\theta)}] \\\\\n& = & \\Im[ \\sqrt{2}I \\{ (\\cos ( \\omega t + \\theta) + j \\sin( \\omega t + \\theta) \\} ] \\\\\n & =& \\sqrt{2}I \\sin (\\omega t + \\theta) = I_m \\sin ( \\omega t+ \\theta)\n\\end{eqnarray*}\n\\end{document}',
'/F': 32,
'/Subtype': '/Text'}
と、これもdictで'/Contents'
に対象がある。
In : page['/Annots'][0].getObject()['/Contents']
Out: '%%TeX2img Document\n% LaTeX compiler: platex\n% DVI driver: dvipdfmx\n\\documentclass[fleqn,papersize]{jsarticle}\n\\usepackage{amsmath,amssymb}\n\\usepackage[dvipdfmx]{graphicx,color}\n\\pagestyle{empty}\n\\parindent = 0pt\n\n\\renewcommand{\\kanjifamilydefault}{\\gtdefault} \n% 日本語書体をゴシック体に\n\\renewcommand{\\familydefault}{\\sfdefault} \n% 欧文書体をHelveticaに\n\\setlength{\\textwidth}{100mm}\n\n\\begin{document}\n複素電圧$ \\dot{V}$や複素電流$ \\dot{I}$から瞬時電圧$v$や瞬時電流$i$を求めるには$\\sqrt{2} e^{j\\omega t} $を乗じた虚部を求めれば良い。\n\n\\begin{eqnarray*}\n\\mbox{複素電圧:} \\dot{V} &=& V e^{j0^\\circ} = V\\angle 0^\\circ = V \\dots (4.35) \\\\\n\\mbox{複素電流:} \\dot{I} &=& I e^{j\\theta } = I\\angle \\theta = I (\\cos \\theta + j\\sin \\theta) \\dots (4.36) \n\\end{eqnarray*}\nとすると\n\\begin{eqnarray*}\nv(t) &=& \\Im [ \\dot{V} \\times \\sqrt{2} e^{j\\omega t} ] = \\Im [ \\sqrt{2} V e^{j \\omega t}] \\\\\n& = & \\Im[ \\sqrt{2}V (\\cos \\omega t + j \\sin \\omega t ) ]\\\\\n& = & \\sqrt{2}V \\sin \\omega t = V_m \\sin \\omega t\\\\\ni(t) &=& \\Im [ \\dot{I} \\times \\sqrt{2} e^{j\\omega t} ] = \\Im [ \\sqrt{2} I e^{j \\theta} e^{j \\omega t}] = \\Im [ \\sqrt{2} I e^{j ( \\omega t + \\theta)}] \\\\\n& = & \\Im[ \\sqrt{2}I \\{ (\\cos ( \\omega t + \\theta) + j \\sin( \\omega t + \\theta) \\} ] \\\\\n & =& \\sqrt{2}I \\sin (\\omega t + \\theta) = I_m \\sin ( \\omega t+ \\theta)\n\\end{eqnarray*}\n\\end{document}'
で拾えた。
In : print(page['/Annots'][0].getObject()['/Contents'])
%%TeX2img Document
% LaTeX compiler: platex
% DVI driver: dvipdfmx
\documentclass[fleqn,papersize]{jsarticle}
\usepackage{amsmath,amssymb}
\usepackage[dvipdfmx]{graphicx,color}
\pagestyle{empty}
\parindent = 0pt
\renewcommand{\kanjifamilydefault}{\gtdefault}
% 日本語書体をゴシック体に
\renewcommand{\familydefault}{\sfdefault}
% 欧文書体をHelveticaに
\setlength{\textwidth}{100mm}
\begin{document}
複素電圧$ \dot{V}$や複素電流$ \dot{I}$から瞬時電圧$v$や瞬時電流$i$を求めるには$\sqrt{2} e^{j\omega t} $を乗じた虚部を求めれば良い。
\begin{eqnarray*}
\mbox{複素電圧:} \dot{V} &=& V e^{j0^\circ} = V\angle 0^\circ = V \dots (4.35) \\
\mbox{複素電流:} \dot{I} &=& I e^{j\theta } = I\angle \theta = I (\cos \theta + j\sin \theta) \dots (4.36)
\end{eqnarray*}
とすると
\begin{eqnarray*}
v(t) &=& \Im [ \dot{V} \times \sqrt{2} e^{j\omega t} ] = \Im [ \sqrt{2} V e^{j \omega t}] \\
& = & \Im[ \sqrt{2}V (\cos \omega t + j \sin \omega t ) ]\\
& = & \sqrt{2}V \sin \omega t = V_m \sin \omega t\\
i(t) &=& \Im [ \dot{I} \times \sqrt{2} e^{j\omega t} ] = \Im [ \sqrt{2} I e^{j \theta} e^{j \omega t}] = \Im [ \sqrt{2} I e^{j ( \omega t + \theta)}] \\
& = & \Im[ \sqrt{2}I \{ (\cos ( \omega t + \theta) + j \sin( \omega t + \theta) \} ] \\
& =& \sqrt{2}I \sin (\omega t + \theta) = I_m \sin ( \omega t+ \theta)
\end{eqnarray*}
\end{document}
LaTeXiTの場合
pdfminerみたいなパッケージでTextだけ拾うなら簡単。埋め込んだTeXソースについては,エンコード済み埋め込みデータとして存在しているので,データを拾ってエンコードして,という感じになりそうだが面倒過ぎて放棄。