PythonでPDFからテキストを抽出する

$ pip3 install pdfminer3

#!/usr/bin/env python3  
# -*- coding: utf-8 -*-

from pdfminer3.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer3.converter import PDFPageAggregator
from pdfminer3.pdfpage import PDFPage
from pdfminer3.layout import LAParams, LTTextContainer

resourceManager = PDFResourceManager()
device = PDFPageAggregator(resourceManager, laparams=LAParams())

pdf_file_name = './sample.pdf'
with open(pdf_file_name, 'rb') as fp:
	interpreter = PDFPageInterpreter(resourceManager, device)
	for page in PDFPage.get_pages(fp):
		interpreter.process_page(page)
		layout = device.get_result()
		for lt in layout:
			if isinstance(lt, LTTextContainer):
				print(lt.get_text())
device.close()

読み込み対象のPDFはこちら

これで実行してみる
$ python3 pdf_text1.py
1. フリーランス新法概要 1

1. フリーランス新法(フリーランス保護新法) 概要

2022年秋の臨時国会でフリーランス保護新法が成立すると報道されています。では、フリーランス保護新法とは一体どんなものなのでしょうか。
業務委託を行う事業者の遵守事項が規定されます。

ア) 業務委託の開始・終了に関する義務
①事業委託の際の書面の交付等
事業者がフリーランスに対して仕事を依頼するときは、「業務委託の内容(仕事内容)、報酬額等」を記載した書面を交付するか、メールなどの電磁的記
録を提供しなければならない
また一定期間以上、継続してフリーランスと仕事をする場合、契約期間や契約の終了事由、中途解約時の費用などを合わせて記載する必要がある
②契約の中途解約・不更新の際の事前予告
「中途解除日または契約期間満了日の30日前まで」にその旨を予告をしなければならない。またフリーランスから求められれば、事業者は契約の終了
理由を明らかにする必要がある。

イ) 業務委託の募集に関する義務
①募集の際の的確表示
不特定多数のフリーランスを対象に仕事を募集する場合は、正確かつ最新の情報を伝えなければならない。虚偽の表示や誤解を生むような表示は禁

②募集に応じた者への条件明示、募集内容と契約内容が異なる場合の説明義務
事業者は応募してきたフリーランスに対し、仕事内容や報酬等を明示しなければんらない。募集時点で明示した情報と異なる内容で契約した場合は、
その旨を説明する必要がある。

ウ) 報酬の支払いに関する義務
事業者はフリーランスから納品物やサービスの提供を受けた日から60日以内に報酬を支払わなければならない。

エ) フリーランスと取引を行う事業者の禁止行為
フリーランスに責任のある理由なしに受領を拒否する
フリーランスに責任のある理由なしに報酬を減額する
フリーランスに責任のある理由なしに返品を行う
相場に比べ、著しく低い報酬額を不当に定める
正当な理由なく、物の購入やサービスの利用を強制する
金銭やサービス、その他の経済上の利益を提供させる
フリーランスに責任のある理由なしに給与の内容を変更させたり、やり直させたりする

関係者外秘

1

2. フリーランス新法概要

2. フリーランス新法(フリーランス保護新法) 概要

オ) 就業環境の整備として事業者が取り組むべき事項
①ハラスメント対策
②出産・育児・介護との両立への配慮

2. 違反した場合の対応等
行政から必要な履歴確保措置が執行される

3.フリーランスの申告及び国が行う相談対応の実現
事業者に違反行為があった場合、フリーランスはその旨を国の行政機関に申告することができる。

関係者外秘

2

うおおおおおおお、これは凄い

PostgreSQLのconstraint

テーブルを作成したのちにテーブルの主キー制約を変更したいことがある
その時に、ALTER TABLE ~ DROP CONSTRAINT と ALTER TABLE ~ ADD CONSTRAINT を使用する

### テーブル作成
CREATE TABLE test(a int PRIMARY KEY, b int, c int);

### 主キー制約の削除
名前をつけていなければ テーブル名_pkey でOK
ALTER TABLE test DROP CONSTRAINT test_pkey;

not nullの削除の方法
ALTER TABLE test ALTER COLUMN a DROP NOT NULL;

### 主キー制約の追加
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a, b);

PostgreSQL シーケンスの利用方法

### シーケンスとは
シーケンスとは連番を払い出してくれるもの。テーブルのIDなどを挿入する際に使用することができる

### シーケンスの使用例
テーブルのIDにシーケンスを使用する例
(1)シーケンスを作成する
(2)シーケンスをテーブルのIDとして挿入する

### シーケンスは以下のように作成
オプションには一番最初に払い出す番号をしているSTARTオプション(START 10)がある。開始番号を指定しなかった場合は1となる

### (1)シーケンスを作成する
CREATE SEQUENCE test_seq;

### (2)シーケンスの確認
testdb=# \d test_seq;
Sequence “public.test_seq”
Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
——–+——-+———+———————+———–+———+——-
bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1

### (3)シーケンスをテーブルのIDとして挿入する
testdb=# CREATE TABLE test_table (id int, name varchar(20));
CREATE TABLE
testdb=# INSERT INTO test_table VALUES (nextval(‘test_seq’), ‘suzuki’);
INSERT 0 1
testdb=# INSERT INTO test_table VALUES (nextval(‘test_seq’), ‘ito’);
INSERT 0 1
testdb=# INSERT INTO test_table VALUES (nextval(‘test_seq’), ‘sato’);
INSERT 0 1
testdb=# SELECT * FROM test_table;
id | name
—-+——–
1 | suzuki
2 | ito
3 | sato
(3 rows)

### (4)シーケンスの確認
testdb=# select currval(‘test_seq’);
currval
———
3
(1 row)

### シーケンスの値をリセット
select setval(‘test_seq’, 1);

なるほど、auto_incrementとは別に値を持つのね

【python3】タイムアウト設定

#!/usr/bin/env python3  
# -*- coding: utf-8 -*-

import sys
import time
from time_decorator import timeout, TimeoutError

class TimeoutDecoratorTest(object):
	def test(self, sleep_sec, timeout_sec):
		@timeout(timeout_sec)
		def inner_test():
			print("Start sleep " + str(sleep_sec) + " seconds.")
			print("Timeout in " + str(timeout_sec) + " seconds.")
			time.sleep(sleep_sec)
		try:
			inner_test()
			print("End sleep.")
		except TimeoutError:
			print("Timeout!")

if __name__ == '__main__':
	sleep_sec = int(sys.argv[1])
	timeout_sec = int(sys.argv[2])
	t = TimeoutDecoratorTest()
	t.test(sleep_sec, timout_sec)

タイムアウト処理を行うためのライブラリ
pip install wrap-timeout-decorator

import wrapt_timeout_decorator

@wrapt_timeout_decorator.timeout(dec_timeout=30)
def func():
while True:
pass

if __name__ == ‘__main__’:
func()

タイムアウトの設定をするのね

【psql】レコードロック

データベースの機能の一つで、あるユーザが参照しているレコードに他のユーザがアクセスできないようにする

FOR UPDATE … 自分が更新する目的で行をロックしておく
FOR SHARE …他からの更新がかからないように行をロック

【PostgreSQL】トランザクション処理の実行

$ sudo -u postgres psql
psql (14.2 (Ubuntu 14.2-1.pgdg20.04+1))
Type “help” for help.

postgres=# \c testdb;
You are now connected to database “testdb” as user “postgres”.
testdb=#

CREATE TABLE book (
id serial NOT NULL,
name VARCHAR(30) NOT NULL,
author VARCHAR(30) NOT NULL,
age integer,
PRIMARY KEY (id)
);

INSERT INTO book(name, author, age) VALUES (‘SQL入門’, ‘Masumi’, 25);
INSERT INTO book(name, author, age) VALUES (‘Flutter入門’, ‘Masumi’, 25);
INSERT INTO book(name, author) VALUES (‘HTML入門’, ‘Hiro’);
INSERT INTO book(name, author, age) VALUES (‘Github入門2’, ‘Emma’, 22);
INSERT INTO book(name, author, age) VALUES (‘Flutter上級’, ‘Oliva’, 45);

testdb=# select * from book;
id | name | author | age
—-+————-+——–+—–
1 | SQL入門 | Masumi | 25
2 | Flutter入門 | Masumi | 25
3 | HTML入門 | Hiro |
4 | Github入門2 | Emma | 22
5 | Flutter上級 | Oliva | 45
(5 rows)

### BEGIN / COMMITとは?
beginはトランザクションを開始するコマンド。
beginが実行されると、自動コミットモードが解除され、それ以降のSQL文による変更が確定しない状態になる。beginをトランザクションを張ると表現することがある。
commitはトランザクションを終了し、変更を確定する

testdb=# begin;
BEGIN
testdb=*# update book set age=age+10 where author=’Emma’;
UPDATE 1
testdb=*# update book set age=age-10 where author=’Oliva’;
UPDATE 1
testdb=*# commit;
COMMIT
testdb=# select * from book;
id | name | author | age
—-+————-+——–+—–
1 | SQL入門 | Masumi | 25
2 | Flutter入門 | Masumi | 25
3 | HTML入門 | Hiro |
4 | Github入門2 | Emma | 32
5 | Flutter上級 | Oliva | 35
(5 rows)

ROLLBACKはトランザクションを終了し、変更を取り消すコマンド

beginとcommitはセットで見た方が良さそうやね

【PostgreSQL】トランザクションについて

トランザクションとはデータベースのデータを利用するときに、複数の処理を一連のものとしてまとめる単位のこと
– Aさんの銀行口座から500万円出金
– Bさんの銀行口座に500万円入金

一連の処理が問題なく行われたときはコミットで終了、途中エラーが発生したときはロールバック
DBのトランザクションはACID特性がある
Atomicity … 完全に実行されるか
Consistency … 実行前後でデータの整合性が担保
Isolation … コミットが確実に保存される

### トランザクションのコマンド
BEGIN
START TRANSACTION
COMMIT
END
ROLLBACK
ABORT

### 分離レベル
READ UNCOMMITED
READ COMMITED
REPEATABLE READ
SERIALIZABLE

なるほど、概念はなんとなく理解した

フォントのグリフ

字体とほぼ同義語だが、記述記号やスペースを含める
文字と記号を含めたものをグリフセットと呼ぶ
ビットパターンやアウトラインなども指す

Excelでも別フォントにフォールバックされる

いきなりグリフと言われても、celticsのグリフィンしか思いつかんわ