如何防止"<<"打破String

时间:2015-08-11 13:03:50

标签: php

我尝试在php中构建一个FDF文件,但我遇到了"<<"的问题。它有点奇怪"<<&#;一切都在删除字符串之前。我知道这个字符是一个操作符,但我怎么能用它来构造一个字符串呢?

这是我的代码:

$fdf = '%FDF-1.2
1 0 obj<</FDF<< /Fields[';

    $fields = "";

    foreach($dataContainer as $data)
    {
        if(array_key_exists($data['fieldname'], $this->fieldSet))
        {
            $field = '('.$data['fieldname'].')';
            $value = '('.$data['content'].')';

            $fields.='<</T'.$field.'/V'.$value.'>>';

            echo $fields." ".$data['fieldname']."<br />";
        }
    }

    $fdf.= $fields;
    $fdf.= '] >> >>
endobj
trailer
<</Root 1 0 R>>
%%EOF';

,输出为:

<
<>
<><>
<><><>
<><><><>

有没有人可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

您的PDF很好,<<或代码中的任何其他内容都没有错。唯一的问题是您可能直接转储生成的PDF内容,因为没有人告诉它,浏览器会尝试将其解释为HTML。

解决方案非常简单:在输出PDF之前使用函数header()告诉浏览器您发送的内容的正确类型:

header('Content-Type: application/pdf');
// ... Generate the PDF here
// ... and output it
echo($fdf);

这就是全部。现在,浏览器知道响应的主体不是HTML,它不会尝试显示它,除非它知道如何阅读PDF(Firefox和Chrome的最新版本显然是这样做的。)

根据浏览器及其设置,它将显示呈现的PDF内容(如打印时在纸张上显示的那样),或者它将打开计算机上安装的默认PDF查看器(Adobe Acrobat Reader,fe)或会询问在哪里保存它,或者会询问上述内容。

答案 1 :(得分:0)

htmlentities()个字符的字符串周围添加<, >可以解决您的问题:

$fdf = '%FDF-1.2
1 0 obj<</FDF<< /Fields[';

    $fields = "";

    foreach($dataContainer as $data)
    {
        if(array_key_exists($data['fieldname'], $this->fieldSet))
        {
            $field = '('.$data['fieldname'].')';
            $value = '('.$data['content'].')';

            $fields.='<</T'.$field.'/V'.$value.'>>';

            echo $fields." ".$data['fieldname']."<br />";
        }
    }

    $fdf.= $fields;
    $fdf.= '] >> >>
endobj
trailer
<</Root 1 0 R>>
%%EOF';

$fdf = htmlentities( $fdf ); // Adding it here would make sure every <, > is replaced