使用 htlatex 将 pdf 转换为 png 并解决格式控制问题

使用 htlatex 将 pdf 转换为 png 并解决格式控制问题

我在 windows 系统上使用 miktex。我尝试将 .tex 文件转换为 html,然后将其复制到 word。挑战来自 .pdf 图

转换过程可以通过上一篇文章实现将 .pdf 图形转换为 html 可以识别的 .png 图形,这里的导入点是将unix系统的gs改为mgs。

然而转换后的数字有一些格式问题,

1 转换后的图形尺寸是原来的两倍,右边的空白部分是转换代码造成的多余部分。2 html 中的图形尺寸太大,占据了页面宽度的数倍。

格式问题图

为了控制图形大小,我尝试了下面的一些代码,width="\expandafter\the\csname Gin@req@width\endcsname" align=center border=0 onerror="this.src='missing.png'" 使用代码后,图形变得太小了。

\Preamble{xhtml}
  \Configure{graphics*}  
         {pdf}  
         {\Needs{"convert '\csname Gin@base\endcsname.pdf'  
                               '\csname Gin@base\endcsname.png'"}%  
          \Picture[pict]{\csname Gin@base\endcsname.png width="\expandafter\the\csname Gin@req@width\endcsname" align=center border=0 onerror="this.src='missing.png'"}%  
          \special{t4ht+@File: \csname Gin@base\endcsname.png}
         }  
\DeclareGraphicsExtensions{.pdf,.png,.jpg,.eps}
\begin{document}
\EndPreamble

是否需要进行更多设置来定义 pdfconvert 以及对图形样式进行更多设置?

1 通过在 pdf 转换命令中添加开关,空白边距已被删除,如下所示

\Preamble{xhtml}
\makeatletter
\Configure{PdfConvert}{png}{"mgs -q -dNOPAUSE -dBATCH -sDEVICE=pngalpha -dUseCropBox  -r300 \ifx\Gin@page\@empty\else -dFirstPage="\Gin@page"  -dLastPage="\Gin@page"\fi\space -sOutputFile="\Gin@base-\[email protected]" "\[email protected]" "}
\makeatother
\begin{document}
\EndPreamble

使用开关 -dusecropbox,分辨率可以设置为 300 或更高。但是,您需要一个额外的 styl 格式文件来定义格式。

样式文件代码如下。基本上,两个 .cfg 图形文件不能轻易合并,无法获得与来自两个单独文件的相同图形格式。

\Preamble{xhtml}

\Configure{@HEAD}{\HCode{<link href="basic.css" rel="stylesheet" type="text/css" />\Hnewline}} 
\DeclareGraphicsRule{.png}{bmp}{.xbb}{}

\ConfigureEnv{table}
   {\ifvmode\IgnorePar\fi\EndP\HCode{<div class="table"\Hnewline>}%
    \bgroup \Configure{float}{\ShowPar}{}{}%
   }
   {\egroup
    \ifvmode\IgnorePar\fi\EndP\HCode{</div>}\ShowPar
\par}
{}{}


\ConfigureEnv{figure}
   {\ifvmode\IgnorePar\fi\EndP\HCode{<div class="figure"\Hnewline>}%
    \bgroup \Configure{float}{\ShowPar}{}{}%
   }
   {\egroup
    \ifvmode\IgnorePar\fi\EndP\HCode{</div>}\ShowPar
\par}
{}{}

\ConfigureEnv{subfigure}
{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="subfigure">}}
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}}{}{}
\Css{.subfigure{display: inline-block;}}
\Css{.subfigure img{display:block;}}

\Css{div.caption {text-align:left;font-size:83\%;text-indent:0em; margin-left:2em; margin-right:2em; }}
%%%font-variant has 4 values, 1 normal 2 small-caps 3 initial 4 inherit
\Css{div.caption span.id{font-variant: initial; white-space: nowrap; }}
%\Css{div.caption span.id{font-variant: small-caps; white-space: nowrap; }} %%originial 
%%%font-variant has 4 values, 1 normal 2 small-caps 3 initial 4 inherit
\Css{.figure div.caption{text-align: center;}}
\Css{.subfigure div.caption{text-align: center;}}
\Css{div.figure{text-align:center;clear:both;overflow:auto;width:100\%;margin-bottom:1em;}}

%%%%% for table 
%\Css{div.caption{text-align:center;}}
%\Configure{float}{\csname par\endcsname\ShowPar}
%{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="float">}}
%{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}\ShowPar}
%%%%%for table

\begin{document}

\makeatletter
% Various helper functions
% default font size
\newcommand\emwidth{16}
\let\emwidth\f@size
% convert pt to rem
\newcommand\CalcRem[1]{\strip@pt\dimexpr(#1)/\emwidth}


%%%%%%convert pdf to png and set the figure size %%%%%%%%%%
  \Configure{graphics*}  
         {pdf}  
       {\Needs{"convert '\csname Gin@base\endcsname.pdf'  
                               '\csname Gin@base\endcsname.png'"}%  

          \Picture[pict]{\csname Gin@base\endcsname.png width="\expandafter\the\csname Gin@req@width\endcsname" align=center border=0 onerror="this.src='missing.png'"}%  
          \special{t4ht+@File: \csname Gin@base\endcsname.png}
         } 





%%%%%convert pdf to png and another method to set figure size%%%%%%%%
%% you must add the file extension with

%  \Configure{graphics*}  
%         {pdf}  
%         {\Needs{"convert '\csname Gin@base\endcsname.pdf'  
%                               '\csname Gin@base\endcsname.png'"}%  
%          \Picture[pict]{\csname Gin@base\endcsname.png
%           \space style="width:\CalcRem{\Gin@req@width}em;"}%  
%          \special{t4ht+@File: \csname Gin@base\endcsname.png}
%           
%         }  


\Configure{graphics*}
{png}
{% we must add the image to the list of output files
  \special{t4ht+@File: \csname Gin@base\endcsname.png}
  \Picture[pict]{\csname Gin@base\endcsname\PictExt
  \space style="width:\CalcRem{\Gin@req@width}em;"
  }%  
}
\makeatother

\EndPreamble

答案1

当前tex4ht代码包含特殊配置,其中包含用于 PDF 转换的 shell 命令:

 \Configure{PdfConvert}{output file format}{command}

可以为不同的输出格式提供不同的命令,例如svgpng。仅当转换后的文件不存在时才执行该命令,从而节省一些编译时间。

以下配置可用于将 PDF 转换为 PNG:

\Preamble{xhtml}
\makeatletter
\Configure{PdfConvert}{png}{"mgs -q -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r120 \ifx\Gin@page\@empty\else -dFirstPage="\Gin@page"  -dLastPage="\Gin@page"\fi\space -sOutputFile="\Gin@base-\[email protected]" "\[email protected]" "}
\makeatother
\begin{document}
\EndPreamble

图像尺寸的重要参数是 -r120,即图像分辨率。默认分辨率为-r300,可能太大了。

编辑:

以下是基于 OP 配置文件的更新配置。它直接在 PDF 包含的配置中指定 PDF 转换的参数:

\Preamble{xhtml}

\Configure{@HEAD}{\HCode{<link href="basic.css" rel="stylesheet" type="text/css" />\Hnewline}} 
\DeclareGraphicsRule{.png}{bmp}{.xbb}{}

\ConfigureEnv{table}
   {\ifvmode\IgnorePar\fi\EndP\HCode{<div class="table"\Hnewline>}%
    \bgroup \Configure{float}{\ShowPar}{}{}%
   }
   {\egroup
    \ifvmode\IgnorePar\fi\EndP\HCode{</div>}\ShowPar
\par}
{}{}


\ConfigureEnv{figure}
   {\ifvmode\IgnorePar\fi\EndP\HCode{<div class="figure"\Hnewline>}%
    \bgroup \Configure{float}{\ShowPar}{}{}%
   }
   {\egroup
    \ifvmode\IgnorePar\fi\EndP\HCode{</div>}\ShowPar
\par}
{}{}

\ConfigureEnv{subfigure}
{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="subfigure">}}
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}}{}{}
\Css{.subfigure{display: inline-block;}}
\Css{.subfigure img{display:block;}}

\Css{div.caption {text-align:left;font-size:83\%;text-indent:0em; margin-left:2em; margin-right:2em; }}
%%%font-variant has 4 values, 1 normal 2 small-caps 3 initial 4 inherit
\Css{div.caption span.id{font-variant: initial; white-space: nowrap; }}
%\Css{div.caption span.id{font-variant: small-caps; white-space: nowrap; }} %%originial 
%%%font-variant has 4 values, 1 normal 2 small-caps 3 initial 4 inherit
\Css{.figure div.caption{text-align: center;}}
\Css{.subfigure div.caption{text-align: center;}}
\Css{div.figure{text-align:center;clear:both;overflow:auto;width:100\%;margin-bottom:1em;}}

%%%%% for table 
%\Css{div.caption{text-align:center;}}
%\Configure{float}{\csname par\endcsname\ShowPar}
%{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="float">}}
%{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}\ShowPar}
%%%%%for table

\begin{document}

\makeatletter
% Various helper functions
% default font size
\newcommand\emwidth{16}
\let\emwidth\f@size
% convert pt to rem
\newcommand\CalcRem[1]{\strip@pt\dimexpr(#1)/\emwidth}


%%%%%%convert pdf to png and set the figure size %%%%%%%%%%
\makeatletter
  \Configure{graphics*}  
         {pdf}  
       {%
   \ifdefined\Gin@page\else\def\Gin@page{1}\fi%
     \edef\svg@filename{\Gin@base-\Gin@page\PictExt}%
     % test for existence of the converted file
     \openin15=\svg@filename\relax
      \ifeof15
      \Needs{"gs -q -dNOPAUSE -dBATCH -dusecropbox -sDEVICE=pngalpha -r120 \ifx\Gin@page\@empty\else -dFirstPage="\Gin@page"  -dLastPage="\Gin@page"\fi\space -sOutputFile="\Gin@base-\[email protected]" "\[email protected]" "}%  
      \fi
      \closein15
          \Picture[pict]{\svg@filename\space width="\expandafter\the\csname Gin@req@width\endcsname" align=center border=0 onerror="this.src='missing.png'"}%  
          \special{t4ht+@File: \svg@filename}
         } 

\makeatother



%%%%%convert pdf to png and another method to set figure size%%%%%%%%
%% you must add the file extension with

%  \Configure{graphics*}  
%         {pdf}  
%         {\Needs{"convert '\csname Gin@base\endcsname.pdf'  
%                               '\csname Gin@base\endcsname.png'"}%  
%          \Picture[pict]{\csname Gin@base\endcsname.png
%           \space style="width:\CalcRem{\Gin@req@width}em;"}%  
%          \special{t4ht+@File: \csname Gin@base\endcsname.png}
%           
%         }  


\Configure{graphics*}
{png}
{% we must add the image to the list of output files
  \special{t4ht+@File: \csname Gin@base\endcsname.png}
  \Picture[pict]{\csname Gin@base\endcsname\PictExt
  \space style="width:\CalcRem{\Gin@req@width}em;"
  }%  
}
\makeatother

\EndPreamble

相关内容