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ソースについては,エンコード済み埋め込みデータとして存在しているので,データを拾ってエンコードして,という感じになりそうだが面倒過ぎて放棄。

Category: Memo Tagged: TeX Python