如何使用Perl中的XML文件中的数据生成PDF文件?

时间:2011-10-15 08:12:53

标签: xml perl pdf

您如何使用模板工具包

阅读此信息
 $var1= {  
  'STC'=>[
     {
        'gym'=>{
              'hyd'=>{
                   'com'=>[
                        'dr'=>'1', 
                         'typ'=>'z',
                          'bemo'=>{
                               'bm'=>'1',
                                'typ'=>'x',
                                'col'=>'red'
                                 }
                               } 
                            {
                          'dr'=>'12', 
                         'typ'=>'a',
                          'bemo'=>{
                               'bm'=>'25',
                                'typ'=>'p',
                                'col'=>'red'
                                 }
                            } 
                         {
                          'dr'=>'23', 
                         'typ'=>'k',
                          'bemo'=>{
                               'bm'=>'22',
                                'typ'=>'w',
                                'col'=>'blue'
                                 }
                            } 
                          {
                          'dr'=>'3', 
                         'typ'=>'s',
                          'bemo'=>{
                               'bm'=>'9',
                                'typ'=>'B',
                                'col'=>'green'
                                 }
                            } 

                          }
                       }
                      ]
                     };

我无法获得这种类型的复杂数据,保留了我解决的所有内容,我正在按照自己的意愿获得输出,但是这个问题让我很痛苦。请帮助我。

2 个答案:

答案 0 :(得分:4)

在不知道XML的样子的情况下,我只能给你一个非常一般的建议。使用XSLT将XML转换为docbook格式。 (对于XSLT,您可以使用Perl模块XML::XSLT或外部XSLT处理器(如xsltproc)。您也可以在没有XSLT的情况下执行此操作,例如using the DOM

对于docbook,存在用于转到RTF或PDF的工具链。对于RTF,您需要openjade

之类的内容

对于PDF,请使用docbook stylesheets转换为FO并使用Apache FOP创建PDF。

后面的大多数步骤都可以使用一些简单的shell脚本完成;如果您愿意,可以使用Perl。

当然,根据您使用的平台(您没有提及),您可以在此处提出许多商业解决方案。例如,这里是a FO-to-RTF converter

如果您的XML非常简单且只是期望一个非常简单的RTF,您可以通过编写自己的XSLT脚本来完成转换,例如在this example中。

(好吧,那不是Perl,但由于它主要是XSLT,所以你应该很容易移植它。)

答案 1 :(得分:1)

好的,所以你有一些数据,你期望它看起来像什么?听起来很危险,你可以简单地在文本编辑器中打开并打印pdf或保存为rtf。显然这不是你的意思。

您需要以某种方式格式化数据。然后,转换只是将您的数据应用于该格式。

当我提到here时,你可以制作一个LaTeX模板并用你的数据填充它Template::Toolkit并使用LaTeX编译器进行编译。这会给你一个PDF。

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Fast;
use Template;

my $xml = <<'XML';
 <student>
      <number>24</number>
      <education>bachelors</education>
      <specialization>computers </specialization>
     -<address>
         <house_number="128"/>
         <street name="xxxx"/>
           <proddutoor/>
      <address/>
     -<details>
          <name="clar"/>
          <age="20"/>
         <sex="m"/>
       </details>
</student>
 <student>
      <number>23</number>
      <education>ph.d.</education>
      <specialization>physics </specialization>
     -<address>
         <house_number="128"/>
         <street name="xxxx"/>
           <proddutoor/>
      <address/>
     -<details>
          <name="joel"/>
          <age="20"/>
         <sex="m"/>
       </details>
</student>
XML
my $xml_hash = xml2hash $xml;

my $template = Template->new();

my $filename = 'output.tex';

#I think the following is a holdover from a previous version
#as I cannot check right now, I will leave as a comment:
#open my $fh, '>', $filename;

$template->process(\*DATA, $xml_hash, $filename)
    || die "Template process failed: ", $template->error(), "\n";

system( "pdflatex $filename" );

__DATA__
\documentclass{article}

\title{Roster}
\author{pavani}

\begin{document}
\maketitle

[% FOREACH st IN student %]
Student [% st.number %] is a [% st.specialization %] [% st.degree %] student.

[% END %]

\end{document}

N.B。 XML::Fast甚至可以很好地对付格式不佳的XML:)