├── pytest.ini ├── requirements.txt ├── amanuense ├── __init__.py ├── __pycache__ │ ├── diario.cpython-36.pyc │ ├── summary.cpython-36.pyc │ ├── utils.cpython-36.pyc │ ├── __init__.cpython-36.pyc │ └── headings.cpython-36.pyc ├── exceptions.py ├── utils.py ├── headings.py ├── summary.py ├── downloader.py └── diario.py ├── Makefile ├── .gitignore ├── ext ├── logo.png └── logo.svg ├── tests ├── data │ ├── DOUS1.pdf │ ├── DOUS1a.pdf │ ├── DOUS2.pdf │ ├── DOUS3.pdf │ └── DOUS4.pdf ├── __pycache__ │ └── tests.cpython-36-PYTEST.pyc └── tests.py ├── .travis.yml ├── README.rst ├── setup.py └── content.txt /pytest.ini: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | lxml 2 | -------------------------------------------------------------------------------- /amanuense/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '0.0.1a' 2 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | test: 2 | python3.6 -m pytest tests/tests.py -v 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *cache/* 2 | htmlcov/ 3 | .py3/ 4 | .coverage 5 | */__pycache__/* 6 | -------------------------------------------------------------------------------- /ext/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/ext/logo.png -------------------------------------------------------------------------------- /tests/data/DOUS1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/tests/data/DOUS1.pdf -------------------------------------------------------------------------------- /tests/data/DOUS1a.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/tests/data/DOUS1a.pdf -------------------------------------------------------------------------------- /tests/data/DOUS2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/tests/data/DOUS2.pdf -------------------------------------------------------------------------------- /tests/data/DOUS3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/tests/data/DOUS3.pdf -------------------------------------------------------------------------------- /tests/data/DOUS4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/tests/data/DOUS4.pdf -------------------------------------------------------------------------------- /amanuense/__pycache__/diario.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/amanuense/__pycache__/diario.cpython-36.pyc -------------------------------------------------------------------------------- /amanuense/__pycache__/summary.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/amanuense/__pycache__/summary.cpython-36.pyc -------------------------------------------------------------------------------- /amanuense/__pycache__/utils.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/amanuense/__pycache__/utils.cpython-36.pyc -------------------------------------------------------------------------------- /amanuense/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/amanuense/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /amanuense/__pycache__/headings.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/amanuense/__pycache__/headings.cpython-36.pyc -------------------------------------------------------------------------------- /tests/__pycache__/tests.cpython-36-PYTEST.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafpyprog/amanuense/HEAD/tests/__pycache__/tests.cpython-36-PYTEST.pyc -------------------------------------------------------------------------------- /amanuense/exceptions.py: -------------------------------------------------------------------------------- 1 | class DiarioNotFoundOnDate(Exception): 2 | def __init__(self, date): 3 | self.message = 'Diario not found on date {0}.'.format(date) 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 3 | 4 | sudo: false 5 | 6 | cache: 7 | - pip 8 | 9 | install: 10 | - pip install -r requirements.txt 11 | 12 | script: 13 | - pip install coveralls pytest 14 | - pytest --cov=amanuense --cov-report html tests/tests.py 15 | - coveralls 16 | 17 | deploy: 18 | provider: pypi 19 | user: $pypi_user 20 | password: $pypi_pass 21 | on: 22 | tags: true 23 | 24 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Amanuense 2 | ========= 3 | 4 | 5 | .. image:: https://raw.githubusercontent.com/rafpyprog/amanuense/master/ext/logo.png 6 | :target: https://github.com/rafpyprog/amanuense 7 | 8 | 9 | Parser do Diário Oficial da União (D.O.U) 10 | 11 | Instalação 12 | ---------- 13 | 14 | 15 | .. code-block:: 16 | 17 | 18 | pip install amanuense 19 | 20 | 21 | Tutorial 22 | -------- 23 | 24 | 25 | .. code-block:: python 26 | 27 | 28 | from amanuense.diario import Diario 29 | 30 | pdf = '/path/diario_oficial.pdf' 31 | diario = Diario(pdf) 32 | 33 | # Quantidade de páginas do documento 34 | diario.page_count 35 | 36 | # Sumário do D.O.U conforme apresentado na primeira página do documento 37 | diario.summary 38 | 39 | # Retorna o conteúdo publicado por um determinado órgão do Governo 40 | PR = 'Presidência da República' 41 | diario.section_contents(PR) 42 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from setuptools import setup 4 | 5 | from amanuense.__init__ import __version__ 6 | 7 | 8 | def read(fname): 9 | return open(os.path.join(os.path.dirname(__file__), fname)).read() 10 | 11 | 12 | setup( 13 | name='amanuense', 14 | version=__version__, 15 | author='Rafael Alves Ribeiro', 16 | author_email='rafael.alves.ribeiro@gmail.com', 17 | description='Parser do Diário Oficial da União (DOU)', 18 | license='MIT', 19 | keywords = 'parser dou', 20 | url = 'https://github.com/rafpyprog/amanuense', 21 | packages=['amanuense'], 22 | install_requires=['lxml',], 23 | extras_require={ 24 | 'test': [ 25 | 'pytest', 26 | 'coverage' 27 | ]}, 28 | long_description=read('README.rst'), 29 | classifiers=[ 30 | 'Development Status :: 2 - Pre-Alpha', 31 | 'Programming Language :: Python :: 3.6', 32 | 'Topic :: Utilities', 33 | 'License :: OSI Approved :: MIT License', 34 | ], 35 | ) 36 | -------------------------------------------------------------------------------- /amanuense/utils.py: -------------------------------------------------------------------------------- 1 | import re 2 | from subprocess import PIPE, Popen 3 | 4 | 5 | def get_line_value(line): 6 | open_tag = re.search('^\n*', line).span() 7 | line = line[open_tag[1]:].replace('', '').strip() 8 | line = line.replace('', '').replace('', '') 9 | return line 10 | 11 | 12 | def get_content_value(line): 13 | if line.strip().startswith('', line).span() 15 | line = line[open_tag[1]:].replace('', '').strip() 16 | line = line.replace('', '').replace('', '') 17 | else: 18 | return '' 19 | return line 20 | 21 | 22 | def count_pdf_pages(filepath, encoding='utf-8'): 23 | ''' PDF page count''' 24 | p = Popen(['pdfinfo', filepath], stdout=PIPE, stderr=PIPE) 25 | stdout, err = p.communicate() 26 | info = stdout.decode(encoding).splitlines() 27 | page_count = [int(i.split(':')[-1].strip()) 28 | for i in info if i.startswith('Pages')][0] 29 | return page_count 30 | -------------------------------------------------------------------------------- /amanuense/headings.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | def font_attr(fontspec, attr): 5 | pattern = '{}=".*?"'.format(attr) 6 | attr = re.search(pattern, fontspec) 7 | if attr: 8 | match = attr.group() 9 | attr_value = match.split('=')[1].replace('"', '') 10 | return attr_value 11 | else: 12 | return False 13 | 14 | 15 | def get_font_styles(page1): 16 | ''' 17 | Busca nos fontspec do documento os id's das fontes referentes aos títulos 18 | do documento. Retorna dicionário com o header e o respectivo id. 19 | ''' 20 | H1_SIZE = "15" 21 | H2_SIZE = "12" 22 | 23 | fonts = {'h1': '', 'h2': '', 'h3': ''} 24 | 25 | specs = [i for i in page1.splitlines() if 'fontspec' in i] 26 | assert(len(specs) > 0) 27 | for spec in specs: 28 | size = font_attr(spec, attr='size') 29 | fontid = font_attr(spec, attr='id') 30 | 31 | if size == H1_SIZE: 32 | fonts['h1'] = fontid 33 | elif size == H2_SIZE: 34 | if fonts['h2'] == '': 35 | fonts['h2'] = fontid 36 | 37 | fonts['h3'] = str(int(fonts['h2']) + 1) 38 | 39 | return fonts 40 | -------------------------------------------------------------------------------- /amanuense/summary.py: -------------------------------------------------------------------------------- 1 | from collections import OrderedDict 2 | import re 3 | 4 | 5 | def clean_summary(summary): 6 | parsed = [] 7 | for i in summary: 8 | item = i.replace('.', '').strip() 9 | parsed.append(item) 10 | return parsed 11 | 12 | 13 | def summary_to_dict(summary): 14 | summary_dict = {} 15 | for i in summary: 16 | find_page = re.search('[0-9]', i) 17 | item_name = i[:find_page.start()].strip() 18 | item_page_number = int(i[find_page.start():].strip()) 19 | summary_dict[item_name] = item_page_number 20 | 21 | summary = OrderedDict(sorted(summary_dict.items(), key=lambda t: t[1])) 22 | return summary 23 | 24 | 25 | def get_summary_content(page): 26 | content = [] 27 | for i in page.splitlines(): 28 | summary_item = ('\n*[A-Z][a-z].*\s?\.' 29 | '\s{1,2}[0-9]{1,3}\n*') 30 | is_sumario = re.match(summary_item, i) 31 | if is_sumario: 32 | text = is_sumario.group(0) 33 | text = text.split('>', 1)[1].replace('', '') 34 | content.append(text) 35 | return content 36 | 37 | 38 | def make_summary(page1): 39 | content = get_summary_content(page1) 40 | summary = clean_summary(content) 41 | summary = summary_to_dict(summary) 42 | return summary 43 | -------------------------------------------------------------------------------- /amanuense/downloader.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import io 3 | import re 4 | import sys 5 | 6 | import aiohttp 7 | from PyPDF2 import PdfFileMerger 8 | import requests 9 | from tqdm import tqdm 10 | 11 | from exceptions import DiarioNotFoundOnDate 12 | 13 | __all__ = 'download_DOU' 14 | 15 | 16 | def diario_URL(secao, date): 17 | ''' Returns an URL for a Diário published on the given date ''' 18 | URL = ('http://pesquisa.in.gov.br/imprensa/jsp/visualiza/index.jsp' 19 | '?jornal={0}&pagina=1&data={1}'.format(secao, date)) 20 | return URL 21 | 22 | 23 | def request_diario_info(section, date): 24 | ''' Request the Diário URL and returns the response ''' 25 | URL = diario_URL(section, date) 26 | diario_info = requests.get(URL) 27 | diario_info.raise_for_status() 28 | return diario_info 29 | 30 | 31 | def diario_not_found(diario_info): 32 | NOT_FOUND = ('Não foi encontrado nenhuma arquivo para os parâmetros ' 33 | 'informados. Verifique a data e a página.') 34 | 35 | if NOT_FOUND in diario_info.text: 36 | return True 37 | else: 38 | return False 39 | 40 | 41 | def diario_page_count(diario_info): 42 | ''' Extract the page count from the diario info ''' 43 | PATTERN = 'Arquivos=\d{1,3}(?=")' 44 | match = re.search(PATTERN, diario_info.text, flags=re.DOTALL).group() 45 | page_count = int(match.split('=')[1]) 46 | return page_count 47 | 48 | 49 | def create_page_URL(secao, page_number, date): 50 | ''' Creates an URL pointing to a PDF page from a given section and 51 | date of Diário Oficial da União ''' 52 | 53 | URL = ('http://pesquisa.in.gov.br/imprensa/servlet/INPDFViewer?' 54 | 'jornal={0}&pagina={1}&data={2}&captchafield=' 55 | 'firistAccess'.format(secao, page_number, date)) 56 | return URL 57 | 58 | 59 | def chunks(l, size): 60 | ''' Yield successive n-sized chunks from l. ''' 61 | for i in range(0, len(l), size): 62 | yield l[i:i + size] 63 | 64 | 65 | async def download_chunks(loop, URLs, pbar): 66 | ''' Download diario pages from a list of URLs ''' 67 | async with aiohttp.ClientSession(loop=loop) as client: 68 | to_do = [download_PDF(client, URL, pbar) for URL in URLs] 69 | responses = await asyncio.gather(*to_do) 70 | return responses 71 | 72 | 73 | async def download_PDF(client, URL, pbar): 74 | ''' Download a diario page and return its contents ''' 75 | async with client.get(URL) as response: 76 | assert response.status == 200 77 | pbar.update(1) 78 | return await response.read() 79 | 80 | 81 | def write_pages_to_PDF(pages, filepath): 82 | ''' Write Diário pages in a list to a pdf file on the disk ''' 83 | pdf = PdfFileMerger() 84 | 85 | for page in pages: 86 | fileobj = io.BytesIO(page) 87 | pdf.append(fileobj=fileobj) 88 | 89 | pdf.write(filepath) 90 | pdf.close() 91 | 92 | 93 | def jornal_URLs(section, date): 94 | ''' Returns a list with URLs to the Diário pages ''' 95 | diario_info = request_diario_info(section, date) 96 | if diario_not_found(diario_info): 97 | raise DiarioNotFoundOnDate(date) 98 | 99 | page_count = diario_page_count(diario_info) 100 | URLs = [create_page_URL(section, n, date) 101 | for n in range(1, page_count + 1)] 102 | return URLs 103 | 104 | 105 | def download_pages(URLs): 106 | '''' Asynchronously downloads a list of URLs refering to Diário pages''' 107 | loop = asyncio.get_event_loop() 108 | pages = [] 109 | with tqdm(total=len(URLs)) as pbar: 110 | for chunk in chunks(URLs, size=10): 111 | res = loop.run_until_complete(download_chunks(loop, chunk, pbar)) 112 | pages.extend(res) 113 | loop.close() 114 | return pages 115 | 116 | 117 | def download_diario(section, date, filepath): 118 | ''' Download the content of a Diário on a given date to a file ''' 119 | URLs = jornal_URLs(section, date) 120 | pages = download_pages(URLs) 121 | 122 | print('Writing pages to pdf {0}...'.format(filepath)) 123 | write_pages_to_PDF(pages, filepath=filepath) 124 | print('Done.') 125 | 126 | 127 | if __name__ == '__main__': 128 | secao = sys.argv[1] 129 | date = sys.argv[2] 130 | output = sys.argv[3] 131 | download_diario(secao, date, output) 132 | -------------------------------------------------------------------------------- /amanuense/diario.py: -------------------------------------------------------------------------------- 1 | import re 2 | from subprocess import PIPE, Popen 3 | 4 | from .utils import count_pdf_pages, get_line_value, get_content_value 5 | from .summary import make_summary 6 | from .headings import get_font_styles, font_attr 7 | 8 | 9 | class Diario(): 10 | def __init__(self, PDF_filepath): 11 | self.PDF = PDF_filepath 12 | self.encoding = 'Latin1' 13 | self._pages = None 14 | self.HEADER_SIZE = 2500 15 | 16 | def __str__(self): 17 | return 'Diario({})'.format(self.PDF) 18 | 19 | def __repr__(self): 20 | return 'Diario({})'.format(self.PDF) 21 | 22 | @property 23 | def page_count(self): 24 | return count_pdf_pages(self.PDF) 25 | 26 | @property 27 | def pages(self): 28 | if self._pages is None: 29 | self._pages = self.parse_pages() 30 | 31 | return self._pages 32 | 33 | @property 34 | def summary(self): 35 | page1 = self.pages[0] 36 | return make_summary(page1) 37 | 38 | @property 39 | def fontstyles(self): 40 | page1 = self.pages[0] 41 | return get_font_styles(page1) 42 | 43 | def parse_pages(self): 44 | xml = self.toxml(self.PDF, self.encoding) 45 | pages = self.get_pages_from_xml(xml) 46 | pages = [self.remove_page_header(i) for i in pages] 47 | return pages 48 | 49 | def toxml(self, filepath, encoding, decode=True): 50 | PDFTOXML = ['pdftohtml', '-xml', '-i', '-stdout', '-enc', encoding, 51 | filepath] 52 | p = Popen(PDFTOXML, stdout=PIPE, stderr=PIPE) 53 | xml_content, err = p.communicate() 54 | 55 | if decode is True: 56 | return xml_content.decode(encoding) 57 | else: 58 | return xml_content 59 | 60 | def get_pages_from_xml(self, xml): 61 | delimiter = '' 62 | pages = [p + delimiter for p in xml.split('')][:-1] 63 | return pages 64 | 65 | def remove_page_header(self, page): 66 | header, body = page[:self.HEADER_SIZE], page[self.HEADER_SIZE:] 67 | 68 | PATTERNS = [ 69 | '\n*()(Ano)\s.*?(o-).*?ISSN.*?ICP-Brasil\.\n*', 70 | '(1|3)', 71 | '(Este documento).*?PÁGINA\n*', 72 | '\d.*?(ICP-Brasil)\.\n*' 73 | ] 74 | 75 | PATTERN = '|'.join(p for p in PATTERNS) 76 | 77 | clean_header = re.sub(PATTERN, '', header, flags=re.DOTALL) 78 | return clean_header + body 79 | 80 | def remove_footer(self, page): 81 | # DOC_ASSINADO = 82 | # '\n*(Documento)\s(assinado).*?(ICP-Brasil)\.\n*' 83 | PATTERN = ('\n*Este documento.' 84 | '*?\d{17}*.*?ICP-Brasil\.\n*') 85 | page = re.sub(PATTERN, '', page, flags=re.DOTALL) 86 | return page 87 | 88 | def find_headers(self, heading): 89 | headers = [] 90 | for page_number, page in enumerate(self.pages): 91 | assert len(page.splitlines()) > 0 92 | lines = [l for l in page.splitlines() if l.strip()] 93 | last_number = None 94 | for line_number, line in enumerate(lines): 95 | font = font_attr(line, 'font') 96 | if font == self.fontstyles[heading]: 97 | if 'Sumário' in line or 'fontspec' in line: 98 | continue 99 | line_value = get_line_value(line) 100 | if headers: 101 | if line_number - 1 == last_number: 102 | headers[-1][-1] = headers[-1][-1] + \ 103 | ' ' + line_value 104 | last_number = line_number 105 | else: 106 | headers.append( 107 | [page_number, line_number, line_value]) 108 | last_number = line_number 109 | else: 110 | headers.append([page_number, line_number, line_value]) 111 | last_number = line_number 112 | return sorted(headers, key=lambda x: x[0]) 113 | 114 | def section_limits(self, section_name): 115 | headers = self.find_headers('h1') 116 | start_page, start_line, n = list( 117 | filter(lambda x: x[-1] == section_name, headers))[0] 118 | end_index = headers.index([start_page, start_line, n]) + 1 119 | end_page, end_line, n = headers[end_index] 120 | return start_page, start_line, end_page, end_line 121 | 122 | def section_contents(self, section_name): 123 | start_page, start_line, end_page, end_line = self.section_limits( 124 | section_name) 125 | section_contents = '' 126 | for index, n in enumerate(range(start_page, end_page + 1)): 127 | if index == start_page: 128 | content = '\n'.join( 129 | self.pages[n].splitlines()[start_line + 1:]) 130 | section_contents += content 131 | elif index == end_page: 132 | content = '\n'.join(self.pages[n].splitlines()[:end_line]) 133 | section_contents += content 134 | else: 135 | content = self.pages[n] 136 | section_contents += content 137 | 138 | lines = section_contents.splitlines() 139 | 140 | return '\n'.join([get_content_value(i) for i in lines]) 141 | -------------------------------------------------------------------------------- /tests/tests.py: -------------------------------------------------------------------------------- 1 | from collections import OrderedDict 2 | import json 3 | import os 4 | import random 5 | import sys 6 | sys.path.insert(0,'../amanuense') 7 | 8 | from unittest.mock import MagicMock 9 | 10 | import pytest 11 | 12 | from amanuense import * 13 | from amanuense.diario import * 14 | from amanuense.summary import get_summary_content, make_summary 15 | from amanuense.headings import get_font_styles, font_attr 16 | 17 | def data_dir(): 18 | cwd = os.getcwd() 19 | data = 'tests/data/' 20 | data_dir = os.path.join(cwd, data) 21 | return data_dir 22 | 23 | def data_files(): 24 | n_files = 3 25 | files = [] 26 | for i in range(1, n_files + 1): 27 | files.append(os.path.join(data_dir(), 'DOUS{}.pdf'.format(i))) 28 | return files 29 | 30 | 31 | @pytest.fixture(scope="module") 32 | def dou_number(): 33 | return random.randint(1, 3) 34 | 35 | 36 | @pytest.fixture(scope='module') 37 | def pages(dou_number): 38 | pages = 'dou{}.pages'.format(dou_number) 39 | fp = os.path.join(data_dir(), pages) 40 | return json.loads(open(fp).read()) 41 | 42 | 43 | @pytest.fixture(scope='module') 44 | def diario(dou_number, pages): 45 | pdf = os.path.join(data_dir(), 'DOUS{}.pdf'.format(dou_number)) 46 | diario = Diario(pdf) 47 | #diario.parse_pages = MagicMock(return_value=pages) 48 | return diario 49 | 50 | @pytest.mark.parametrize('pdf', data_files()) 51 | def test_diario_init(pdf): 52 | diario = Diario(pdf) 53 | assert isinstance(diario, Diario) 54 | 55 | 56 | @pytest.mark.parametrize('pdf', data_files()) 57 | def test_pages(pdf): 58 | diario = Diario(pdf) 59 | assert isinstance(diario.pages, list) 60 | assert diario.pages != [] 61 | 62 | @pytest.mark.parametrize('pdf', data_files()) 63 | def test_page_count_equals_pages(pdf): 64 | diario = Diario(pdf) 65 | assert diario.page_count == len(diario.pages) 66 | 67 | 68 | @pytest.mark.parametrize('pdf', data_files()) 69 | def test_toxml_decode_and_returns_valid_string(pdf): 70 | diario = Diario(pdf) 71 | string = diario.toxml(fp, 'Latin1', decode=True) 72 | assert string not in ('', None) 73 | 74 | 75 | @pytest.mark.parametrize('pdf', data_files()) 76 | def test_toxml_decode_and_returns_string(pdf): 77 | diario = Diario(pdf) 78 | fp = os.path.join(data_dir(), 'DOUS1.pdf') 79 | assert isinstance(diario.toxml(fp, 'latin1', decode=True), str) 80 | 81 | 82 | @pytest.mark.parametrize('pdf', data_files()) 83 | def test_remove_page_header(pdf): 84 | diario = Diario(pdf) 85 | for n, page in enumerate(diario.pages): 86 | assert page.find('ICP-Brasil.') == -1 87 | assert page.find('>Este documento pode ser verificado') == -1 88 | 89 | 90 | @pytest.mark.parametrize('pdf', data_files()) 91 | def test_summary_content_is_list(pdf): 92 | diario = Diario(pdf) 93 | page1 = diario.pages[0] 94 | isinstance(get_summary_content(page1), list) 95 | 96 | 97 | @pytest.mark.parametrize('pdf, expected', zip(data_files(), [21, 29, 27])) 98 | def test_summary_content_has_all_items(pdf, expected): 99 | diario = Diario(pdf) 100 | page1 = diario.pages[0] 101 | content = get_summary_content(page1) 102 | assert len(content) == expected 103 | 104 | 105 | @pytest.mark.parametrize('pdf, expected', zip(data_files(), [21, 29, 27])) 106 | def test_male_summary(pdf, expected): 107 | diario = Diario(pdf) 108 | page1 = diario.pages[0] 109 | summary = make_summary(page1) 110 | assert len(summary) == expected 111 | 112 | 113 | ATOS = 'Atos do Poder Judiciário' 114 | PR = 'Presidência da República' 115 | @pytest.mark.parametrize('pdf, expected', zip(data_files(), [ATOS, PR, PR])) 116 | def test_make_summary(pdf, expected): 117 | diario = Diario(pdf) 118 | summary = diario.summary 119 | assert list(summary.keys())[0] == expected 120 | 121 | 122 | @pytest.mark.parametrize('pdf, expected', zip(data_files(), [ATOS, PR, PR])) 123 | def test_font_attr(pdf, expected): 124 | diario = Diario(pdf) 125 | page1 = diario.pages[0] 126 | specs = [i for i in page1.splitlines() if 'fontspec' in i] 127 | size = font_attr(specs[0], 'size') 128 | assert isinstance(size, str) 129 | assert size != '' 130 | assert len(size) <= 2 131 | 132 | id = font_attr(specs[0], 'id') 133 | assert isinstance(id, str) 134 | assert id != '' 135 | assert len(id) <= 2 136 | 137 | 138 | @pytest.mark.parametrize('pdf, expected', zip(data_files(), 139 | [('5', '10', '11'), 140 | ('4', '5', '6'), 141 | ('5', '10', '11')])) 142 | def test_get_font_styles(pdf, expected): 143 | diario = Diario(pdf) 144 | page1 = diario.pages[0] 145 | styles = get_font_styles(page1) 146 | assert isinstance(styles, dict) 147 | assert tuple(styles.values()) == expected 148 | 149 | 150 | @pytest.mark.parametrize('pdf, expected', zip(data_files(), 151 | [('5', '10', '11'), 152 | ('4', '5', '6'), 153 | ('5', '10', '11')])) 154 | def test_diario_font_styles(pdf, expected): 155 | diario = Diario(pdf) 156 | page1 = diario.pages[0] 157 | styles = get_font_styles(page1) 158 | assert isinstance(diario.fontstyles, dict) 159 | assert tuple(diario.fontstyles.values()) == expected 160 | 161 | 162 | @pytest.mark.parametrize('pdf, expected', zip(data_files(), 163 | [('5', '10', '11'), 164 | ('4', '5', '6'), 165 | ('5', '10', '11')])) 166 | def test_find_header(pdf, expected): 167 | diario = Diario(pdf) 168 | h1 = diario.find_headers('h1') 169 | assert h1 is not None 170 | assert len(h1) == len(diario.summary) 171 | 172 | 173 | @pytest.mark.parametrize('pdf, expected', zip(data_files(), 174 | [(1, 33, 1, 198), 175 | (0, 30, 2, 137), 176 | (0, 215, 2, 240)])) 177 | def test_get_section_limits(pdf, expected): 178 | diario = Diario(pdf) 179 | assert diario.section_limits('Presidência da República') == expected 180 | 181 | @pytest.mark.parametrize('pdf, expected', zip(data_files(), 182 | [(1, 33, 1, 198), 183 | (0, 30, 2, 137), 184 | (0, 215, 2, 240)])) 185 | def test_get_section_contents(pdf, expected): 186 | diario = Diario(pdf) 187 | contents = diario.section_contents('Presidência da República') 188 | with open('content.txt', 'w') as f: 189 | f.write(contents) 190 | assert contents != '' 191 | -------------------------------------------------------------------------------- /content.txt: -------------------------------------------------------------------------------- 1 | Presidência da República 2 | . 3 | 4 | 5 | 6 | 7 | 8 | SUPERINTENDÊNCIA REGIONAL NO PIAUÍ 9 | DIVISÃO ADMINISTRATIVA 10 | EXTRATO DE TERMO ADITIVO 11 | Processo: 54380.000811/2015-05. Espécie:Primeiro Termo Aditivo ao 12 | Acordo de Cooperação Técnica 01/2015. Partes: Instituto Nacional de 13 | Colonização e Reforma Agrária - INCRA-PI e a Prefeitura Municipal 14 | de Altos-PI. Objeto: Prorrogação do prazo de vigência contratual pelo 15 | período de 2 anos, de acordo com cláusula quinta do acordo inicial, e 16 | na conformidade do art. 57, inciso II, § 1º da Lei 8.666/93. Vigência: 17 | 30/09/2017 a 30/09/2019. Data de assinatura: 27/09/2017. Assina pelo 18 | INCRA: Howzembergson de Brito Lima - Superintendente Regional. 19 | Assina pela prefeitura: Patrícia Mara da Silva Pinheiro - Prefeita 20 | Municipal. 21 | SUPERINTENDÊNCIA REGIONAL 22 | NO RIO GRANDE DO NORTE 23 | EXTRATO DE ACORDO DE COOPERAÇÃO TÉCNICA 24 | Espécie: Acordo de Cooperação Técnica firmado entre o INCRA e a 25 | Prefeitura Municipal de ParnamirimlRN. CNPJ 08.170.862/0001-74. 26 | Objeto: Avaliação - por parte da SR-19/RN INCRA - dos produtos 27 | apresentados pela consultoria, a ser contratada pela Prefeitura do 28 | Município de ParnamirinilRN, para elaboração de relatório antro- 29 | pológico de caracterização histórica, econômica, sociocultural e am- 30 | biental, o qual deverá fornecer subsídios técnicos para a identificação 31 | e delimitação do território da comunidade remanescente de quilombo 32 | de Moita Verde, localizada no município. Fundamento Legal: Art. 68 33 | do ADCT, Arts. 215 e 216 da Constituição de 1988, Decreto 34 | 4.887/2003 e Lei 8.666/93. Vigência: 03 (três) anos da data de sua 35 | publicação no Diário Oficial da União - DOU. Processo: 36 | 54330.000369/2017-66. Assinatura: Natal/RN, 12/09/2017. Signatá- 37 | rios: José Leonardo Guedes Bezerra - Superintendente Regional do 38 | INCRA/RN e Rosario Taveira da Cunha - Prefeito Municipal de 39 | Parnamirim/RN. 40 | SUPERINTENDÊNCIA REGIONAL 41 | NO RIO GRANDE DO SUL 42 | DIVISÃO DE DESENVOLVIMENTO DE PROJETOS 43 | DE ASSENTAMENTO 44 | EXTRATO DE TERMO ADITIVO 45 | Segundo Termo de Prorrogação de Ofício ao Termo de Compromisso 46 | nº 678623 Processo: 54220.003075/2013-18 Compromitente:: IN- 47 | CRA/RS, CNPJ 00.375.972/0013-02 Objeto: Prorrogar a vigência do 48 | Termo de Compromisso por mais 68(sessenta e oito) dias e realizar o 49 | devido ajuste no plano de trabalho.Vigência:20(dias) contados a partir 50 | da assinatura. Data da assinatura: 29/09/2017 Signatário: André Mu- 51 | rad Bessow - Superintendente Regional do INCRA/RS, CPF Nº 52 | 975.343.150-34. 53 | SUPERINTENDÊNCIA REGIONAL EM SÃO PAULO 54 | AVISO DE LICITAÇÃO 55 | PREGÃO N 56 | o- 57 | 10/2017 - UASG 373066 58 | Nº Processo: 54190001556201717 . Objeto: Pregão Eletrônico - A 59 | licitação tem por objeto a aquisição de 100 (cem) rolos de lona 60 | plástica medindo 08mt de largura x 100mt de comprimento, com 200 61 | micras de espessura, para atender às famílias de trabalhadores rurais 62 | sem terra acampados em situações emergenciais no Estado de São 63 | Paulo, conforme especificações do TERMO DE REFERÊNCIA - 64 | ANEXO I do Edital, através do Sistema de Registro de Preços, para 65 | a Superintendência Regional do INCRA no Estado de São Paulo, pelo 66 | MENOR VALOR DO ITEM. Total de Itens Licitados: 00001. Edital: 67 | 04/10/2017 de 09h00 às 12h00 e de 14h00 às 16h00. Endereço: Rua 68 | Brasilio Machado, 203 - 7º Andar - Bairro de Santa Cecília Santa 69 | Cecilia - SAO PAULO 70 | - SP ou www.comprasgovernamen- 71 | tais.gov.br/edital/373066-05-10-2017. Entrega das Propostas: a partir 72 | de 04/10/2017 às 09h00 no site www.comprasnet.gov.br. Abertura das 73 | Propostas: 19/10/2017 às 09h00 no site www.comprasnet.gov.br. 74 | VALQUIRIA MARIA PESSOA ROCHA 75 | Pregoeiro 76 | (SIDEC - 03/10/2017) 373066-37201-2017NE800034 77 | DIVISÃO DE ORDENAMENTO DA ESTRUTURA 78 | FUNDIÁRIA 79 | EXTRATO DE ACORDO DE COOPERAÇÃO TÉCNICA N 80 | o 81 | - 82 | 34/2017 83 | Acordo Cooperação Técnica que firma o Instituto Nacional de Co- 84 | lonização e Reforma Agrária - INCRA, atraves da SUPERINTEN- 85 | DENCIA REGIONAL DE SAO PAULO - CNPJ 00.375.972/0010-51 86 | e a PREFEITURA MUNICIPAL DE ITUPEVA no Estado de Sao 87 | Paulo - CNPJ 45780061000157 registrado sob o CRT/SP/0034/2017 88 | Processo Administrativo Incra - SP - N 54190.001814/2017-57. Ob- 89 | jeto: Instituir parceria para implantar o projeto Sala da Cidadania, 90 | disponibilizando servicos relacionados ao cadastro rural, ao atendi- 91 | mento dos proprietarios e dos possuidores de imoveis rurais da Re- 92 | giao, aos Projetos de Assentamentos e ao atendimento aos assentados 93 | e assentadas da Reforma Agraria jurisdicionados pelo INCRA/SP na 94 | Regiao e no municipio, bem como, ao publico em geral. - Vigencia: 95 | 36 (trinta e seis) meses a partir da data da assinatura. Data da As- 96 | sinatura 21.06.2017 - Data do Inicio 04.10.2017 e Data do Termino 97 | 04.10.2020. Signatarios: ALEXANDRE PEREIRA DA SILVA CPF 98 | 288.693.918-84 - Superintendente Regional do INCRA SP e MARCO 99 | ANTONIO MARCHI - Prefeito Municipal de Itupeva /SP CPF 100 | 256.747.278-99. 101 | EXTRATO DE ACORDO DE COOPERAÇÃO TÉCNICA N 102 | o 103 | - 104 | 35/2017 105 | Acordo Cooperação Técnica que firma o Instituto Nacional de Co- 106 | lonização e Reforma Agrária - INCRA, atraves da SUPERINTEN- 107 | DENCIA REGIONAL DE SAO PAULO - CNPJ 00.375.972/0010-51 108 | e a PREFEITURA MUNICIPAL DE PIRASSUNUNGA no Estado de 109 | Sao 110 | Paulo 111 | - 112 | CNPJ 45.731.650/0001-45 113 | registrado 114 | sob 115 | o 116 | CRT/SP/0035/2017 - Processo Administrativo Incra - SP - N 117 | 54190.001813/2017-11. Objeto: Instituir parceria para implantar o 118 | projeto Sala da Cidadania, disponibilizando servicos relacionados ao 119 | cadastro rural, ao atendimento dos proprietarios e dos possuidores de 120 | imoveis rurais da Regiao, aos Projetos de Assentamentos e ao aten- 121 | dimento aos assentados e assentadas da Reforma Agraria jurisdi- 122 | cionados pelo INCRA/SP na Regiao e no municipio, bem como, ao 123 | publico em geral. - Vigencia: 36 (trinta e seis) meses a partir da data 124 | da assinatura. Data da Assinatura 20.09.2017 - Data do Inicio 125 | 04.10.2017 e Data do Termino 04.10.2020. Signatarios: ALEXAN- 126 | DRE PEREIRA DA SILVA CPF 288.693.918-84 - Superintendente 127 | Regional do INCRA SP e ADEMIR ALVES LINDO - Prefeito Mu- 128 | nicipal de Pirassununga /SP CPF 016.192.378/06. 129 | SUPERINTENDÊNCIA REGIONAL NO TOCANTINS 130 | DIVISÃO DE OBTENÇÃO DE TERRAS E 131 | IMPLANTAÇÃO DE PROJETOS DE ASSENTAMENTO 132 | RETIFICAÇÃO 133 | No Extrato de Termo Aditivo Nº 8001/2017 publicado no 134 | D.O. de 17/04/2017 , Seção 3, Pág. 1. Onde se lê: 60(sessenta) Leia- 135 | se : 90(noventa) 136 | (SICON - 03/10/2017) 373085-37201-2017NE800110 137 | S E C R E TA R I A - G E R A L 138 | EXTRATO DE ACORDO DE COOPERAÇÃO TÉCNICA 139 | Acordo de Cooperação Técnica entre: A Secretaria-Geral da Pre- 140 | sidência da República, CNPJ nº 00.394.411/0001-09, e a Associação 141 | Movimento Brasil Competitivo - MBC, CNPJ n° 00.731.979/0001-78. 142 | ESPÉCIE: Acordo de Cooperação Técnica nº 19/2017 (Processo SEI 143 | nº 00133.000327/2017-22). OBJETO: Conjugação de esforços para a 144 | execução do Projeto a ser desenvolvido junto ao ENTE PÚBLICO, 145 | visando ao desenvolvimento de estudos para subsidiar tecnicamente a 146 | priorização e a viabilização de novos investimentos no setor fer- 147 | roviário, sob o contexto das prorrogações antecipadas dos contratos 148 | de parceria, no âmbito do Programa de Parcerias de Investimentos - 149 | PPI. VIGÊNCIA: Vigorará pelo prazo de 15 (quinze) meses, contados 150 | a partir da data de sua assinatura, podendo ser alterado, com exceção 151 | do objeto, ou prorrogado, mediante a celebração de Termo (s) Aditivo 152 | (s) entre os Partícipes. DATA DE ASSINATURA: 02/10/2017, W. 153 | Moreira Franco - Ministro de Estado Chefe da Secretaria-Geral e 154 | Claudio Leite Gastal - Presidente Executivo do MBC. 155 | SECRETARIA DE ADMINISTRAÇÃO 156 | EXTRATO DE INEXIGIBILIDADE DE LICITAÇÃO 157 | N 158 | o- 159 | 8/2017 - UASG 110001 160 | Nº Processo: 00230000520201765 . Objeto: Assinatura de uso da 161 | base de dados médica UpToDate Anywhere, pelo período de 12 162 | (doze) meses. Total de Itens Licitados: 00001. Fundamento Legal: 163 | Art. 25, Caput da Lei nº 8.666 de 21/06/1993.. Justificativa: É um 164 | sistema eletrônico de informação de saúde que responde a questões 165 | da prática clínica, de forma acessível. Declaração de Inexigibilidade 166 | em 02/10/2017. GIRLEY VIEIRA DAMASCENO. Diretor de Re- 167 | cursos Logísticos. Ratificação em 03/10/2017. ANTONIO CARLOS 168 | PAIVA FUTURO. Secretário de Administração. Valor Global: R$ 169 | 20.413,24. CNPJ CONTRATADA : 55.491.484/0001-00 WOLTERS 170 | KLUWER BRASIL TECNOLOGIA S.A. 171 | (SIDEC - 03/10/2017) 110001-00001-2017NE800458 172 | EXTRATO DE TERMO ADITIVO N 173 | o- 174 | 1/2017 - UASG 110001 175 | Número do Contrato: 62/2016. 176 | Nº Processo: 00094001539201579. 177 | PREGÃO SISPP Nº 94/2015. Contratante: PRESIDENCIA DA RE- 178 | PUBLICA -.CNPJ Contratado: 15688081000131. Contratado : F. T. 179 | & W. COMUNICAÇÕES LTDA - ME-.Objeto: Prorrogação de vi- 180 | gência contratual. Fundamento Legal: Lei 8.666/93 . Vigência: 181 | 27/09/2017 a 27/09/2018. Data de Assinatura: 27/09/2017. 182 | (SICON - 03/10/2017) 110001-00001-2017NE800175 183 | EMPRESA DE PLANEJAMENTO E LOGÍSTICA S.A. 184 | RESULTADO DE JULGAMENTO 185 | PREGÃO N 186 | o- 187 | 9/2017 188 | Processo nº. 50840.000738/2016-29: O Pregoeiro da Empresa de Pla- 189 | nejamento e Logística S/A - EPL comunica que no Pregão nº 9/2017, 190 | sagrou-se vencedora do certame a empresa LINK INFORMATICA 191 | EIRELI - EPP, CNPJ: 06.885.830/0001-20, pelo valor total anual de 192 | R$ 157.309,20. 193 | ANTHONY CESAR DUARTE ROSIMO 194 | Pregoeiro 195 | (SIDEC - 03/10/2017) 395001-39253-2017NE800006 196 | EMPRESA BRASIL DE COMUNICAÇÃO S/A 197 | RESULTADO DE JULGAMENTO 198 | PREGÃO N 199 | o- 200 | 18/2017 201 | O Pregoeiro da EBC torna público que a empresa Rapidonet 202 | Sistemas e Automação Eireli-EPP foi avencedora do certame. 203 | OLDESIRIO LEMOS DE CASTRO 204 | (SIDEC - 03/10/2017) 115406-20415-2017NE000238 205 | ADVOCACIA-GERAL DA UNIÃO 206 | SECRETARIA-GERAL DE ADMINISTRAÇÃO 207 | SUPERINTENDÊNCIA DE ADMINISTRAÇÃO 208 | NO DISTRITO FEDERAL 209 | EXTRATO DE CONTRATO N 210 | o- 211 | 41/2017 - UASG 110161 212 | Nº Processo: 00405015069201731. 213 | INEXIGIBILIDADE Nº 5/2017. Contratante: ADVOCACIA GERAL 214 | DA UNIAO -.CPF Contratado: ESTRANGEIRO. Contratado : CHIO- 215 | MENTI STUDIO LEGALE. Objeto: Contratação de escritório de 216 | advocacia na Italia, com a finalidade de atender ao Ministério dos 217 | Transportes, Portos e Aviação Civil, para adoção das providências 218 | necessárias à continuidade da defesa dos interesses da União naquele 219 | país, relacionados aos procedimentos judiciais iniciados pela empresa 220 | italiana Italplan Engineering, Enviroment e Transports Spa em face da 221 | República Federativa do Brasil e da empresa pública Valec Enge- 222 | nharia, Construções e Ferrovias S.a. Fundamento Legal: Lei nº 223 | 8.666/93 . Vigência: 12/09/2017 a 11/09/2019. Valor Total: R$ 224 | 4.093.760,00. Fonte: 100000000 - 2017NE801421 Fonte: 250000000 225 | - 2017NE801422. Data de Assinatura: 12/09/2017. 226 | (SICON - 03/10/2017) 110161-00001-2017NE000096 227 | AVISO DE LICITAÇÃO 228 | PREGÃO N 229 | o- 230 | 43/2017 - UASG 110161 231 | Nº Processo: 00676000892201752 . Objeto: Pregão Eletrônico - Es- 232 | colha da proposta mais vantajosa para a contratação de empresa para 233 | prestação de serviços comuns de engenharia, com fornecimento de 234 | mão de obra, materiais de consumo e reposição de peças, relativos à 235 | manutenção preventiva e corretiva nos Sistemas de resfriamento de 236 | liquido (SRL), composto por Chilleres, bombas de pressurização e 237 | caixas de expansão, bem como aparelhos de ar-condicionado tipo 238 | 239 | 240 | 241 | Split, quantidades e exigências estabelecidas no Edital e seus anexos. 242 | Total de Itens Licitados: 00001. Edital: 04/10/2017 de 08h00 às 243 | 12h00 e de 14h00 às 17h59. Endereço: Sig Quadra 06 Lote 800 Sig 244 | - BRASILIA - DF ou www.comprasgovernamentais.gov.br/edi- 245 | tal/110161-05-43-2017. Entrega das Propostas: a partir de 04/10/2017 246 | às 08h00 no site www.comprasnet.gov.br. Abertura das Propostas: 247 | 17/10/2017 às 10h00 no site www.comprasnet.gov.br. Informações 248 | Gerais: O edital encontra-se disponível nos sites: www.agu.gov.br e 249 | w w w. c o m p r a s n e t . g o v. b r. 250 | ANGELITA MARIA DA COSTA 251 | Pregoeira 252 | (SIDEC - 03/10/2017) 110161-00001-2017NE000096 253 | SUPERINTENDÊNCIA DE ADMINISTRAÇÃO 254 | NO RIO DE JANEIRO 255 | EXTRATO DE DISPENSA DE LICITAÇÃO N 256 | o 257 | - 258 | 19/2017 - UASG 110102 259 | Nº Processo: 00592001350201484 . Objeto: Contratação de serviço 260 | de Recepção para atender as unidades no Estado do Espirito Santo. 261 | Total de Itens Licitados: 00001. Fundamento Legal: Art. 24º, Inciso 262 | XI da Lei nº 8.666 de 21/06/1993.. Justificativa: Contratação Re- 263 | manescente proveniente do Pregão nº 025/2014. Declaração de Dis- 264 | pensa em 03/10/2017. TIAGO SILVA JACOB. Coordenador de Des- 265 | pesas Substituto. Ratificação em 03/10/2017. HERMINGTON 266 | CHIANCA COUTO. Superintendente Regional Substituto. Valor Glo- 267 | bal: R$ 148.448,16. CNPJ CONTRATADA : 42.040.279/0001-87 268 | CONVIC CONSERVACAO E SERVICOS GERAIS EIRELI. 269 | (SIDEC - 03/10/2017) 110102-00001-2017NE000096 270 | EXTRATO DE RESCISÃO DO CONTRATO N 271 | o- 272 | 1/2015 273 | Nº Processo: 00592001350201484. Contratante: SUPERINTENDEN- 274 | CIA DE ADMINISTRAÇÃO NO RIO DE JANEIRO. CNPJ Con- 275 | tratado: 10570183000134. Contratado : SERVIMAR SERVIÇOS E 276 | CONSERVAÇÃO LTDA - ME. Objeto: Recepção na unidades do ES 277 | Fundamento Legal: Art. 77, Lei 8666/1993 Data de Rescisão: 278 | 29/09/2017 . 279 | (SICON - 03/10/2017) 110161-00001-2017NE000096 280 | SUPERINTENDÊNCIA DE ADMINISTRAÇÃO 281 | NO RIO GRANDE DO SUL 282 | EXTRATO DE TERMO ADITIVO N 283 | o- 284 | 4/2017 - UASG 110097 285 | Número do Contrato: 26/2013. 286 | Nº Processo: 00588000915201394. 287 | PREGÃO SISPP Nº 30/2013. Contratante: SUPERINTENDENCIA 288 | DE ADMINISTRAÇÃO NO RIO GRANDE DO SUL. CNPJ Con- 289 | tratado: 05824788000174. Contratado : EMPRESA DE TRANSPOR- 290 | TES KOPERECK LTDA - ME. Objeto: Prorrogação do prazo de 291 | vigência contratual por mais 12(doze)meses, pertinente a locação de 292 | veículo com motorista, em proveito da PSF/Pelotas/RS, período de 293 | 17/10/2017 a 16/10/2018.Fundamento Legal: lei 8666/93 e alterações 294 | . Vigência: 17/10/2017 a 16/10/2018. Valor Total: R$65.289,60. Fon- 295 | te: 188000000 - 2017NE800224. Data de Assinatura: 25/09/2017. 296 | (SICON - 03/10/2017) 110061-00001-2017NE000096 297 | EXTRATO DE TERMO ADITIVO N 298 | o- 299 | 8/2017 - UASG 110097 300 | Número do Contrato: 47/2007. 301 | Nº Processo: 00435001213200723. 302 | DISPENSA Nº 132/2007. Contratante: SUPERINTENDENCIA DE 303 | ADMINISTRAÇÃO NO RIO GRANDE DO SUL. CNPJ Contratado: 304 | 76352442000169. Contratado : TAM EMPREENDIMENTOS IMO- 305 | BILIARIOS LTDA - EPP. Objeto: Prorrogação do prazo de vigência 306 | contratual por mais 24 (vinte e quatro) meses e supressão de uma área 307 | comercial térrea de 194,77m², a partir de 01/10/2017,em proveito da 308 | PSF/Joinville. Fundamento Legal: lei 8666/93 e alterações . Vigência: 309 | 01/10/2017 310 | a 30/09/2019. 311 | Valor 312 | Total: R$563.425,44. 313 | Fonte: 314 | 188000000 - 2017NE800163. Data de Assinatura: 28/09/2017. 315 | (SICON - 03/10/2017) 110061-00001-2017NE000096 316 | RESULTADO DE JULGAMENTO 317 | PREGÃO N 318 | o- 319 | 8/2017 320 | A Pregoeira da Superintendencia de Administraç o da Ad- 321 | vocacia Geral da União da 4ª Região, to na publico o resultado da 322 | licitação, declarand vencedora do grupo a licitante MAR & MAR 323 | VEIC LOS LTDA, com o valor global anual de R$ 1.313.391,32. O 324 | processo encontra-se disponivel para vistas dos interessados. 325 | MARILDA VULCÃO LEAO 326 | (SIDEC - 03/10/2017) 110061-00001-2017NE000096 327 | GABINETE DE SEGURANÇA INSTITUCIONAL 328 | AGÊNCIA BRASILEIRA DE INTELIGÊNCIA 329 | AVISO DE LICITAÇÃO 330 | PREGÃO N 331 | o- 332 | 26/2017 - UASG 110120 333 | Nº Processo: 91.001150/2017-21 . Objeto: Pregão Eletrônico - Aqui- 334 | sição de microcomputadores, estações de trabalho e ultrabooks. Total 335 | de Itens Licitados: 00003. Edital: 04/10/2017 de 09h00 às 12h00 e de 336 | 14h00 às 17h30. Endereço: Spo Area 05, Quadra 01 - Bloco g Sala 337 | 221 Asa Sul - BRASILIA - DF ou www.comprasgovernamen- 338 | tais.gov.br/edital/110120-05-26-2017. Entrega das Propostas: a partir 339 | de 04/10/2017 às 09h00 no site www.comprasnet.gov.br. Abertura das 340 | Propostas: 17/10/2017 às 10h00 no site www.comprasnet.gov.br. 341 | MARTA BRENDA SIQUEIRA CORTEZ BASTOS 342 | Pregoeira 343 | (SIDEC - 03/10/2017) 110120-00001-2017NE800037 344 | COMPANHIA NACIONAL DE ABASTECIMENTO 345 | AVISOS DE LICITAÇÃO 346 | PREGÃO Nº 18/2017 - UASG 135100 347 | Nº Processo: 21200001126201348 . Objeto: Pregão Eletrônico - 348 | Aquisição de cofres à prova de fogo para mídias magnéticas; car- 349 | tuchos de fita magnética LTO-6; cartuchos de fita magnética LTO-6 350 | tipo Worm e HDs (hard drive) externos, de acordo com as quan- 351 | tidades, exigências e especificações constantes no Termo de Refe- 352 | rência do Edital. Total de Itens Licitados: 00004. Edital: 04/10/2017 353 | de 08h00 às 12h00 e de 14h00 às 17h30. Endereço: Sgas 901, Lote 354 | 69, Ed. Conab Asa Sul - BRASILIA - DF ou www.comprasgo- 355 | vernamentais.gov.br/edital/135100-05-18-2017. Entrega das Propos- 356 | tas: a partir de 04/10/2017 às 08h00 no site www.comprasnet.gov.br. 357 | Abertura das Propostas: 19/10/2017 às 09h00 no site www.compras- 358 | net.gov.br. Informações Gerais: O Edital poderá ser retirado junto a 359 | CPL ou por meio de download gratuíto nos sites www.conab.gov.br e 360 | www.comprasgovernamentais.gov.br. Maiores informações pelo tele- 361 | fone (061) 3312-6002. 362 | RAIMILSON FERNANDES DA SILVA 363 | Pregoeiro 364 | (SIDEC - 03/10/2017) 135100-22211-2017NE000068 365 | PREGÃO Nº 1/2017 - UASG 135325 366 | Nº Processo: 21201000047201652 . Objeto: Pregão Eletrônico - O 367 | objeto da presente licitação é a escolha da proposta mais vantajosa 368 | para a contratação de serviços de locação de veículos, sem motorista, 369 | para atendimento aos técnicos e servidores da CONAB, dentro da 370 | capital e no Estado de São Paulo. A licitação será pelo menor preço 371 | global por diária, com quilometragem livre e seguro total, sem fran- 372 | quias. Total de Itens Licitados: 00003. Edital: 05/10/2017 de 08h00 às 373 | 12h00 e de 13h00 às 17h00. Endereço: Alameda Campinas, 433 - 374 | Jardim Paulista - São Paulo Jardim Paulista - SAO PAULO - SP ou 375 | www.comprasgovernamentais.gov.br/edital/135325-05-1-2017. Entre- 376 | ga das Propostas: a partir de 05/10/2017 às 08h00 no site www.com- 377 | prasnet.gov.br. Abertura das Propostas: 31/10/2017 às 09h00 no site 378 | w w w. c o m p r a s n e t . g o v. b r. 379 | FELIPE KAROLSKI 380 | Gerente Financeiro e Administrativo 381 | (SIDEC - 03/10/2017) 135325-22211-2017NE000016 382 | RESULTADO DE JULGAMENTO 383 | PREGÃO Nº 7/2017 384 | Comunicamos que foi adjudicada e homologada a licitação 385 | Pregão Eletrônico nº 007/2017 em favorda empresa ROBERT EN- 386 | GENHARIA LTDA - ME, inscrita no CNPJ/MF sob o nº 387 | 21.407.989/0001-22, no valor mensal de R$ 16.120,00(dezeseis mil 388 | cento evinte reais) e anual no valor total de R$ 193.440,00(cento e 389 | noventa e três mil quatrocentos equarenta reais), para o fornecimento 390 | de mão deobra especializada Eletricista e Mecanico Industrial, para a 391 | Unidade Armazenadora Rio Formosona cidade Formoso do Ara- 392 | g u a i a / TO . 393 | PAULO ROBERTO BEZERRA 394 | Pregoeiro 395 | (SIDEC - 03/10/2017) 135337-22211-2017NE000004 396 | SUPERINTENDÊNCIA DE ACOMPANHAMENTO 397 | DAS REGIONAIS 398 | SUPERINTENDÊNCIA REGIONAL 399 | NO RIO DE JANEIRO 400 | AVISO DE SUSPENSÃO 401 | PREGÃO Nº 4/2017 402 | Comunicamos a suspensão da licitação supracitada, publi- 403 | cada no D.O.U em 03/10/2017 . Objeto: Pregão Eletrônico - A pre- 404 | sente licitação tem como objeto a contratação, de forma contínua, de 405 | empresa especializada na prestação de serviços de vigilância patri- 406 | monial armada e desarmada, diurna e noturna, que compreenderá, 407 | além da mão de obra, o fornecimento de uniformes e o emprego de 408 | todos os equipamentos, ferramentas e EPI's necessários a execução 409 | dos aludidos serviços nas dependências da Conab, conforme espe- 410 | cificações discriminadas no Termo de Referência Anexo I, deste Edi- 411 | tal. 412 | JORGE LUIZ SOARES DOMINGUES 413 | Pregoeiro 414 | (SIDEC - 03/10/2017) 135305-22211-2017NE000068 415 | SUPERINTENDÊNCIA REGIONAL 416 | EM MINAS GERAIS 417 | AVISO DE LICITAÇÃO 418 | PREGÃO Nº 4/2017 - UASG 135182 419 | Nº Processo: 2120800014/2013 . Objeto: Pregão Eletrônico - For- 420 | necimento e instalação de portões metálicos para os armazéns con- 421 | vencionais nº 01,02 e 03 da unidade armazenadora de Uberlân- 422 | dia/MG. Total de Itens Licitados: 00001. Edital: 04/10/2017 de 08h00 423 | CENTRAIS DE ABASTECIMENTO 424 | DE MINAS GERAIS S/A 425 | EXTRATOS DE TERMOS ADITIVOS 426 | Primeiro aditivo ao contrato 11/2017. Partes: CEASAMINAS e Via- 427 | gem para Você Agência de Viagem e Turismo Ltda. Objeto: a al- 428 | teração do item 5.4, da Cláusula Quinta, do contrato original 11/2017, 429 | que passa a ter a seguinte redação: Os pagamentos ficam condi- 430 | cionados ao recebimento técnico do serviço, e serão realizados por 431 | medições mensais, 10 (dez) dias após a entrega e aceite, mediante a 432 | apresentação da competente Nota Fiscal/Fatura, depois de conferida e 433 | atestada pela Seção competente", conforme justificativas do Fiscal. 434 | Data da assinatura: 30/06/2017 435 | Segundo aditivo ao contrato 102/2015. Partes: CEASAMINAS e 436 | Companhia de Tecnologia da Informação do Estado de Minas Gerais 437 | - PRODEMGE. Objeto: 1.2 Prorrogar a vigência do Contrato original 438 | por 12 (doze) meses, a partir de 15.10.2017. 1.3 Reajustar o preço dos 439 | serviços continuados em 4,10 % (quatro inteiros e dez centésimos por 440 | cento), conforme acordado entre as partes. 1.4 Alterar o item 2.1 da 441 | Cláusula 2ª - DOS NÍVEIS DE SERVIÇO - dos serviços de In- 442 | tegração à Rede IP Multisserviços, Gestão de Contratos da Rede IP 443 | Multisserviços e Conexão de Alta Disponibilidade à internet, con- 444 | forme estabelecido nas Intervenções Direta Caderno de Serviços nº 445 | 044/2016 de 22/11/2016 e 041/2016 de 01/11/2016. 1.5 Incluir su- 446 | bitem no item 4.5 da Cláusula 4ª - Do Valor, do Pagamento e do 447 | Reajuste do contrato original conforme estabelecido na intervenção 448 | direta do caderno de serviços nº 039/2016 de 01/11/2016. 1.6 Incluir 449 | os itens 4.6, 4.7, 4.8, 4.9, 4.10, 4.10.1, 4.11 na Cláusula 4ª - DO 450 | VALOR, DO PAGAMENTO E DO REAJUSTE conforme estabe- 451 | lecido nas Intervenções Direta Caderno de Serviços nº 034/2016 de 452 | 30/09/2016 e 006/2017 de 22/03/2017. 1.7 Alterar a Cláusula 8ª - Da 453 | Confidencialidade e Segurança conforme estabelecido na intervenção 454 | Direta Caderno de Serviços nº 032/2016 de 27/09/2016. 1.8 Alterar o 455 | item 14.2 - Inciso II, da cláusula 14ª - Das Penalidades, conforme 456 | estabelecido na intervenções Direta Caderno de Serviços nº 005/2016 457 | de 09/03/2016 e n° 09/2016 de 04/05/2016. 1.9 Incluir a Cláusula 19ª 458 | - dos Casos Omissos, conforme estabelecido na intervenção Direta 459 | Caderno de Serviços nº 038/2016 de 27/10/2016 e renumerar a Cláu- 460 | sula subsequente. Valor: mensal de R$ 3.119,92 (três mil, cento e 461 | dezenove reais e noventa e dois centavos) e anual de 37.439,04 (trinta 462 | e sete mil, quatrocentos e trinta e nove reais e quatro centavos) Data 463 | da assinatura: 02/10/2017 464 | COMPANHIA DE ENTREPOSTOS 465 | E ARMAZÉNS GERAIS DE SÃO PAULO 466 | EXTRATO DE CONTRATO 467 | Espécie: 468 | Contrato nº 469 | 050/17-2022-1709-02-030-12-1. 470 | Processo: 471 | 050/2017. Objeto: Contratação de serviços - Renovação do suporte 472 | técnico e atualização de versão, corretiva e evolutivas, para solução 473 | de e-mail e colaboração. Contratada: INOVA TECNOLOGIAS DE 474 | INFORMAÇÃO E REPRESENTAÇÕES 475 | LTDA, CNPJ/MF nº 476 | 01.427.728/0001-67. Valor Total de: R$ 49.785,00 (quarenta e nove 477 | mil, setecentos e oitenta e cinco reais) nos termos da Cláusula Quarta. 478 | Vigência: 12 (doze) meses contados a partir do início da ordem de -------------------------------------------------------------------------------- /ext/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 18 | 20 | 21 | 23 | image/svg+xml 24 | 26 | Circle and it's center 27 | 28 | 29 | 30 | 32 | 39 | 43 | 48 | 49 | 59 | 61 | 65 | 66 | 68 | 72 | 73 | 75 | 79 | 80 | 87 | 91 | 95 | 96 | 98 | 102 | 106 | 107 | 109 | 113 | 117 | 121 | 122 | 124 | 130 | 131 | 134 | 137 | 138 | 146 | 150 | 154 | 158 | 162 | 166 | 170 | 171 | 179 | 183 | 187 | 191 | 195 | 199 | 203 | 204 | 212 | 216 | 220 | 224 | 228 | 232 | 236 | 237 | 245 | 249 | 253 | 257 | 261 | 265 | 269 | 270 | 278 | 282 | 286 | 290 | 294 | 298 | 302 | 303 | 311 | 315 | 319 | 323 | 327 | 331 | 335 | 336 | 344 | 348 | 352 | 356 | 360 | 364 | 368 | 369 | 377 | 381 | 385 | 389 | 393 | 397 | 401 | 402 | 410 | 414 | 418 | 422 | 426 | 430 | 434 | 435 | 443 | 447 | 451 | 455 | 459 | 463 | 467 | 468 | 476 | 480 | 484 | 488 | 492 | 496 | 500 | 501 | 509 | 513 | 517 | 521 | 525 | 529 | 533 | 534 | 542 | 546 | 550 | 554 | 558 | 562 | 566 | 567 | 575 | 579 | 583 | 587 | 591 | 595 | 599 | 600 | 608 | 612 | 616 | 620 | 624 | 628 | 632 | 633 | 641 | 645 | 649 | 653 | 657 | 661 | 665 | 666 | 674 | 678 | 682 | 686 | 690 | 694 | 698 | 699 | 707 | 711 | 715 | 719 | 723 | 727 | 731 | 732 | 740 | 744 | 748 | 752 | 756 | 760 | 764 | 765 | 773 | 777 | 781 | 785 | 789 | 793 | 797 | 798 | 806 | 810 | 814 | 818 | 822 | 826 | 830 | 831 | 839 | 843 | 847 | 851 | 855 | 859 | 863 | 864 | 872 | 876 | 880 | 884 | 888 | 892 | 896 | 897 | 905 | 909 | 913 | 917 | 921 | 925 | 929 | 930 | 938 | 942 | 946 | 950 | 954 | 958 | 962 | 963 | 971 | 975 | 979 | 983 | 987 | 991 | 995 | 996 | 1004 | 1008 | 1012 | 1016 | 1020 | 1024 | 1028 | 1029 | 1037 | 1041 | 1045 | 1049 | 1053 | 1057 | 1061 | 1062 | 1070 | 1074 | 1078 | 1082 | 1086 | 1090 | 1094 | 1095 | 1103 | 1107 | 1111 | 1115 | 1119 | 1123 | 1127 | 1128 | 1136 | 1140 | 1144 | 1148 | 1152 | 1156 | 1160 | 1161 | 1169 | 1173 | 1177 | 1181 | 1185 | 1189 | 1193 | 1194 | 1202 | 1206 | 1210 | 1214 | 1218 | 1222 | 1226 | 1227 | 1235 | 1239 | 1243 | 1247 | 1251 | 1255 | 1259 | 1260 | 1268 | 1272 | 1276 | 1280 | 1284 | 1288 | 1292 | 1293 | 1301 | 1305 | 1309 | 1313 | 1317 | 1321 | 1325 | 1326 | 1334 | 1338 | 1342 | 1346 | 1350 | 1354 | 1358 | 1359 | 1367 | 1371 | 1375 | 1379 | 1383 | 1387 | 1391 | 1392 | 1400 | 1404 | 1408 | 1412 | 1416 | 1420 | 1424 | 1425 | 1433 | 1437 | 1441 | 1445 | 1449 | 1453 | 1457 | 1458 | 1466 | 1470 | 1474 | 1478 | 1482 | 1486 | 1490 | 1491 | 1499 | 1503 | 1507 | 1511 | 1515 | 1519 | 1523 | 1524 | 1532 | 1536 | 1540 | 1544 | 1548 | 1552 | 1556 | 1557 | 1565 | 1569 | 1573 | 1577 | 1581 | 1585 | 1589 | 1590 | 1598 | 1602 | 1606 | 1610 | 1614 | 1618 | 1622 | 1623 | 1631 | 1635 | 1639 | 1643 | 1647 | 1651 | 1655 | 1656 | 1664 | 1668 | 1672 | 1676 | 1680 | 1684 | 1688 | 1689 | 1697 | 1701 | 1705 | 1709 | 1713 | 1717 | 1721 | 1722 | 1730 | 1734 | 1738 | 1742 | 1746 | 1750 | 1754 | 1755 | 1763 | 1767 | 1771 | 1775 | 1779 | 1783 | 1787 | 1788 | 1796 | 1800 | 1804 | 1808 | 1812 | 1816 | 1820 | 1821 | 1829 | 1833 | 1837 | 1841 | 1845 | 1849 | 1853 | 1854 | 1862 | 1866 | 1870 | 1874 | 1878 | 1882 | 1886 | 1887 | 1895 | 1899 | 1903 | 1907 | 1911 | 1915 | 1919 | 1920 | 1928 | 1932 | 1936 | 1940 | 1944 | 1948 | 1952 | 1953 | 1961 | 1965 | 1969 | 1973 | 1977 | 1981 | 1985 | 1986 | 1994 | 1998 | 2002 | 2006 | 2010 | 2014 | 2018 | 2019 | 2027 | 2031 | 2035 | 2039 | 2043 | 2047 | 2051 | 2052 | 2060 | 2064 | 2068 | 2072 | 2076 | 2080 | 2084 | 2085 | 2093 | 2097 | 2101 | 2105 | 2109 | 2113 | 2117 | 2118 | 2126 | 2130 | 2134 | 2138 | 2142 | 2146 | 2150 | 2151 | 2159 | 2163 | 2167 | 2171 | 2175 | 2179 | 2183 | 2184 | 2192 | 2196 | 2200 | 2204 | 2208 | 2212 | 2216 | 2217 | 2218 | 2240 | 2244 | 2248 | 2252 | 2253 | Circle and it's center 2255 | 2266 | 2277 | 2322 | 2325 | 2329 | 2333 | 2334 | 2335 | --------------------------------------------------------------------------------