⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.php

📁 Bug tracker, and reporter.
💻 PHP
📖 第 1 页 / 共 2 页
字号:
                throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X.  Cross-reference stream expected.', $offset));            }            $trailerDict = $xrefStream->dictionary;            if ($trailerDict->Type->value != 'XRef') {                throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X.  Cross-reference stream object must have /Type property assigned to /XRef.', $offset));            }            if ($trailerDict->W === null  || $trailerDict->W->getType() != Zend_Pdf_Element::TYPE_ARRAY) {                throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Cross reference stream dictionary doesn\'t have W entry or it\'s not an array.', $offset));            }            $entryField1Size = $trailerDict->W->items[0]->value;            $entryField2Size = $trailerDict->W->items[1]->value;            $entryField3Size = $trailerDict->W->items[2]->value;            if ($entryField2Size == 0 || $entryField3Size == 0) {                throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Wrong W dictionary entry. Only type field of stream entries has default value and could be zero length.', $offset));            }            $xrefStreamData = &$xrefStream->value;            if ($trailerDict->Index !== null) {                if ($trailerDict->Index->getType() != Zend_Pdf_Element::TYPE_ARRAY) {                    throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Cross reference stream dictionary Index entry must be an array.', $offset));                }                $sections = count($trailerDict->Index->items)/2;            } else {                $sections = 1;            }            $streamOffset = 0;            $size    = $entryField1Size + $entryField2Size + $entryField3Size;            $entries = strlen($xrefStreamData)/$size;            for ($count = 0; $count < $sections; $count++) {                if ($trailerDict->Index !== null) {                    $objNum  = $trailerDict->Index->items[$count*2    ]->value;                    $entries = $trailerDict->Index->items[$count*2 + 1]->value;                } else {                    $objNum  = 0;                    $entries = $trailerDict->Size->value;                }                for ($count2 = 0; $count2 < $entries; $count2++) {                    if ($entryField1Size == 0) {                        $type = 1;                    } else if ($entryField1Size == 1) { // Optimyze one-byte field case                        $type = ord($xrefStreamData[$streamOffset++]);                    } else {                        $type = Zend_Pdf_StringParser::parseIntFromStream($xrefStreamData, $streamOffset, $entryField1Size);                        $streamOffset += $entryField1Size;                    }                    if ($entryField2Size == 1) { // Optimyze one-byte field case                        $field2 = ord($xrefStreamData[$streamOffset++]);                    } else {                        $field2 = Zend_Pdf_StringParser::parseIntFromStream($xrefStreamData, $streamOffset, $entryField2Size);                        $streamOffset += $entryField2Size;                    }                    if ($entryField3Size == 1) { // Optimyze one-byte field case                        $field3 = ord($xrefStreamData[$streamOffset++]);                    } else {                        $field3 = Zend_Pdf_StringParser::parseIntFromStream($xrefStreamData, $streamOffset, $entryField3Size);                        $streamOffset += $entryField3Size;                    }                    switch ($type) {                        case 0:                            // Free object                            $refTable->addReference($objNum . ' ' . $field3 . ' R', $field2, false);                            // Debug output:                            // echo "Free object - $objNum $field3 R, next free - $field2\n";                            break;                        case 1:                            // In use object                            $refTable->addReference($objNum . ' ' . $field3 . ' R', $field2, true);                            // Debug output:                            // echo "In-use object - $objNum $field3 R, offset - $field2\n";                            break;                        case 2:                            // Object in an object stream                            // Debug output:                            // echo "Compressed object - $objNum 0 R, object stream - $field2 0 R, offset - $field3\n";                            break;                    }                    $objNum++;                }            }            // $streamOffset . ' ' . strlen($xrefStreamData) . "\n";            // "$entries\n";            throw new Zend_Pdf_Exception('Cross-reference streams are not supported yet.');        }        $trailerObj = new Zend_Pdf_Trailer_Keeper($trailerDict, $context);        if ($trailerDict->Prev instanceof Zend_Pdf_Element_Numeric ||            $trailerDict->Prev instanceof Zend_Pdf_Element_Reference ) {            $trailerObj->setPrev($this->_loadXRefTable($trailerDict->Prev->value));            $context->getRefTable()->setParent($trailerObj->getPrev()->getRefTable());        }        /**         * We set '/Prev' dictionary property to the current cross-reference section offset.         * It doesn't correspond to the actual data, but is true when trailer will be used         * as a trailer for next generated PDF section.         */        $trailerObj->Prev = new Zend_Pdf_Element_Numeric($offset);        return $trailerObj;    }    /**     * Get Trailer object     *     * @return Zend_Pdf_Trailer_Keeper     */    public function getTrailer()    {        return $this->_trailer;    }    /**     * Object constructor     *     * Note: PHP duplicates string, which is sent by value, only of it's updated.     * Thus we don't need to care about overhead     *     * @param mixed $source     * @param Zend_Pdf_ElementFactory_Interface $factory     * @param boolean $load     * @throws Zend_Exception     */    public function __construct($source, Zend_Pdf_ElementFactory_Interface $factory, $load)    {        if ($load) {            if (($pdfFile = @fopen($source, 'rb')) === false ) {                throw new Zend_Pdf_Exception( "Can not open '$source' file for reading." );            }            $byteCount = filesize($source);            $data = fread($pdfFile, $byteCount);            $byteCount -= strlen($data);            while ( $byteCount > 0 && ($nextBlock = fread($pdfFile, $byteCount)) != false ) {                $data .= $nextBlock;                $byteCount -= strlen($nextBlock);            }            fclose($pdfFile);            $this->_stringParser = new Zend_Pdf_StringParser($data, $factory);        } else {            $this->_stringParser = new Zend_Pdf_StringParser($source, $factory);        }        $pdfVersionComment = $this->_stringParser->readComment();        if (substr($pdfVersionComment, 0, 5) != '%PDF-') {            throw new Zend_Pdf_Exception('File is not a PDF.');        }        $pdfVersion = (float)substr($pdfVersionComment, 5);        if ($pdfVersion < 0.9 || $pdfVersion >= 1.61) {            /**             * @todo             * To support PDF versions 1.5 (Acrobat 6) and PDF version 1.7 (Acrobat 7)             * Stream compression filter must be implemented (for compressed object streams).             * Cross reference streams must be implemented             */            throw new Zend_Pdf_Exception(sprintf('Unsupported PDF version. Zend_Pdf supports PDF 1.0-1.4. Current version - \'%f\'', $pdfVersion));        }        $this->_stringParser->offset = strrpos($this->_stringParser->data, '%%EOF');        if ($this->_stringParser->offset === false ||            strlen($this->_stringParser->data) - $this->_stringParser->offset > 7) {            throw new Zend_Pdf_Exception('Pdf file syntax error. End-of-fle marker expected at the end of file.');        }        $this->_stringParser->offset--;        /**         * Go to end of cross-reference table offset         */        while (Zend_Pdf_StringParser::isWhiteSpace( ord($this->_stringParser->data[$this->_stringParser->offset]) )&&               ($this->_stringParser->offset > 0)) {            $this->_stringParser->offset--;        }        /**         * Go to the start of cross-reference table offset         */        while ( (!Zend_Pdf_StringParser::isWhiteSpace( ord($this->_stringParser->data[$this->_stringParser->offset]) ))&&               ($this->_stringParser->offset > 0)) {            $this->_stringParser->offset--;        }        /**         * Go to the end of 'startxref' keyword         */        while (Zend_Pdf_StringParser::isWhiteSpace( ord($this->_stringParser->data[$this->_stringParser->offset]) )&&               ($this->_stringParser->offset > 0)) {            $this->_stringParser->offset--;        }        /**         * Go to the white space (eol marker) before 'startxref' keyword         */        $this->_stringParser->offset -= 9;        $nextLexeme = $this->_stringParser->readLexeme();        if ($nextLexeme != 'startxref') {            throw new Zend_Pdf_Exception(sprintf('Pdf file syntax error. \'startxref\' keyword expected. Offset - 0x%X.', $this->_stringParser->offset-strlen($nextLexeme)));        }        $startXref = $this->_stringParser->readLexeme();        if (!ctype_digit($startXref)) {            throw new Zend_Pdf_Exception(sprintf('Pdf file syntax error. Cross-reference table offset must contain only digits. Offset - 0x%X.', $this->_stringParser->offset-strlen($nextLexeme)));        }        $this->_trailer = $this->_loadXRefTable($startXref);        $factory->setObjectCount($this->_trailer->Size->value);    }    /**     * Object destructor     */    public function __destruct()    {        $this->_stringParser->cleanUp();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -