LatestDuplicate_Working / pixelconversion.py
Marthee's picture
Update pixelconversion.py
8ce3007 verified
# -*- coding: utf-8 -*-
"""pixelconversion.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1hfdgkYOw8w6DdJqsZx8txmw8INUGxesl
"""
# pip install pymupdf -q
"""### Imports"""
import fitz
from PIL import Image
import numpy as np
import cv2
import db
import tsadropboxretrieval
import fitz
import math
from io import BytesIO
################################################
### Check if page is visually rotated or not
def is_content_rotated(docpage):
docpage.draw_rect([250,250,docpage.mediabox.width-500,docpage.mediabox.height-500], color = (0,0,0), width = 1,fill=(0,0,0),fill_opacity=1)
pix = docpage.get_pixmap()
image = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
img = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2GRAY)
kernel = np.ones((3,3),np.uint8)
img = cv2.dilate(img,kernel, iterations=6)
img=cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV)[1]
# cv2_imshow(img)
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Check the orientation of page through large shape drawn
for contour in contours:
rect = cv2.minAreaRect(contour)
angle = rect[-1]
# print(angle)
if angle != 0.0 and angle != 90.0 and angle != 180.0 and angle!=-90.0 and angle!=-180.0:
print("Page content appears visually rotated.")
return True
print("Page content does not appear visually rotated.")
return False
# def drawisrotated(data=0,pdf_content=0,dpi=0):
# if pdf_content:
# docPath = fitz.open(stream=pdf_content, filetype="pdf")
# else:
# docPath = fitz.open("pdf",data) #dropbox path
# pageDocPath=docPath[0]
# bool_T_F=is_content_rotated(pageDocPath)
# if bool_T_F==True:
# if pdf_content:
# docPath = fitz.open(stream=pdf_content, filetype="pdf")
# else:
# docPath = fitz.open("pdf",data) #dropbox path
# pageDocPath=docPath[0]
# pageDocPath.draw_rect([250,250,pageDocPath.mediabox.width-500,pageDocPath.mediabox.height-500], color = (75/255,0,130/255), width = 1,fill=(75/255,0,130/255),fill_opacity=0.9)
# if dpi:
# pix=pageDocPath.get_pixmap(dpi=dpi)
# newwidth_ratio=pix.width/pageDocPath.mediabox.width
# newheight_ratio=pix.height/pageDocPath.mediabox.height
# else:
# newwidth_ratio=1
# newheight_ratio=1
# area=((pageDocPath.mediabox.height-500-250)*newheight_ratio) * ((pageDocPath.mediabox.width-500-250)*newwidth_ratio)
# perimeter=(((pageDocPath.mediabox.width-500-250)*newwidth_ratio) *2) + ( ((pageDocPath.mediabox.height-500-250)*newheight_ratio) *2)
# if pageDocPath.mediabox.height >pageDocPath.mediabox.width:
# rectText=fitz.Rect(300, 200, (pageDocPath.mediabox.width-80),( pageDocPath.mediabox.width+80) )
# else:
# rectText=fitz.Rect(500, 200, (pageDocPath.mediabox.height-80),( pageDocPath.mediabox.height+80) )
# text = """Scale Document"""
# annot1=pageDocPath.add_freetext_annot(rectText, text, fontsize=45, fontname='helv', border_color=(1,1,1), text_color=(1,1,1), rotate= pageDocPath.rotation, align=1)
# annot1.update()
# # docPath.save('drawnOn.pdf')
# return docPath,area,perimeter
# else:
# if pdf_content:
# if dpi:
# doc,area,perimeter=openDrawPDF(pdf_content=pdf_content,dpi=dpi)
# return doc,area,perimeter
# else:
# doc,area,perimeter=openDrawPDF(pdf_content=pdf_content)
# return doc,area,perimeter
# else:
# if dpi:
# doc,area,perimeter=openDrawPDF(data,dpi=dpi)
# return doc,area,perimeter
# else:
# doc,area,perimeter=openDrawPDF(data)
# return doc,area,perimeter
def drawisrotated(data=0,pdf_content=0,dpi=0):
if pdf_content:
docPath = fitz.open(stream=pdf_content, filetype="pdf")
else:
docPath = fitz.open("pdf",data) #dropbox path
if pdf_content:
if dpi:
doc,area,perimeter=openDrawPDF(pdf_content=pdf_content,dpi=dpi)
return doc,area,perimeter
else:
doc,area,perimeter=openDrawPDF(pdf_content=pdf_content)
return doc,area,perimeter
else:
if dpi:
doc,area,perimeter=openDrawPDF(data,dpi=dpi)
return doc,area,perimeter
else:
doc,area,perimeter=openDrawPDF(data)
return doc,area,perimeter
# def openDrawPDF(data=0,pdf_content=0,dpi=0):
# if pdf_content:
# doc = fitz.open(stream=pdf_content, filetype="pdf")
# else:
# doc = fitz.open("pdf",data) #dropbox path
# page = doc[0]
# print(page.rotation)
# if page.rect.height > page.rect.width:
# rectText = fitz.Rect(300, 200, (page.mediabox.width - 80), (page.mediabox.width + 80))
# else:
# rectText = fitz.Rect(500, 200, (page.mediabox.height - 80), (page.mediabox.height + 80))
# page.draw_rect([0 + 10, 0 + 10, page.mediabox.width - 10, page.mediabox.height - 10],color=(75 / 255, 0, 130 / 255), width=1, fill=(75 / 255, 0, 130 / 255), fill_opacity=0.9)
# if dpi:
# pix = page.get_pixmap(dpi=dpi)
# newwidth_ratio = pix.width / page.mediabox.width
# newheight_ratio = pix.height / page.mediabox.height
# else:
# print('No DPI specified')
# newwidth_ratio = 1
# newheight_ratio = 1
# # Apply the transformation to the rectangle's area and perimeter
# area = ((page.mediabox.width - 10 - 10) * newwidth_ratio) * ((page.mediabox.height - 10 - 10) * newheight_ratio)
# perimeter = (((page.mediabox.width - 10 - 10) * 2) * newwidth_ratio) + (((page.mediabox.height - 10 - 10) * 2) * newheight_ratio)
# # Apply the transformation to the text annotation (shift and scale its position)
# text = """Scale Document"""
# annot1 = page.add_freetext_annot(rectText, text, fontsize=45, fontname='helv', border_color=(1, 1, 1),text_color=(1, 1, 1), rotate=page.rotation, align=1)
# annot1.update()
# # print('fitzzzzzzzzzzzz',fitz.__version__)
# # doc.save('drawnOn_transformed.pdf')
# return doc, area, perimeter
def openDrawPDF(data=0,pdf_content=0,dpi=0):
# Open the document
# doc = fitz.open(pdfOutput) # Dropbox
if pdf_content:
doc = fitz.open(stream=pdf_content, filetype="pdf")
else:
doc = fitz.open("pdf",data) #dropbox path
page = doc[0]
derotationMatrix=page.derotation_matrix
print(page.rotation)
if page.rect.height > page.rect.width:
rectText = fitz.Rect(300, 200, (page.mediabox.width - 80), (page.mediabox.width + 80))
else:
rectText = fitz.Rect(500, 200, (page.mediabox.height - 80), (page.mediabox.height + 80))
if dpi:
pix = page.get_pixmap(dpi=dpi)
newwidth_ratio = pix.width / page.mediabox.width
newheight_ratio = pix.height / page.mediabox.height
else:
print('No DPI specified')
newwidth_ratio = 1
newheight_ratio = 1
# Apply the transformation to the rectangle's area and perimeter
area = ((page.mediabox.width) * newwidth_ratio) * ((page.mediabox.height ) * newheight_ratio)
perimeter = (((page.mediabox.width ) * 2) * newwidth_ratio) + (((page.mediabox.height) * 2) * newheight_ratio)
# full page rectangle
# Original diagonal points
startRect = fitz.Point(0, 0)
endRect = fitz.Point(page.mediabox.width, page.mediabox.height)
# Apply derotation if needed
# startRect = startRect * derotationMatrix
# endRect = endRect * derotationMatrix
# Create rectangle corners from diagonal points
top_left = fitz.Point(startRect.x, startRect.y)
top_right = fitz.Point(endRect.x, startRect.y)
bottom_right = fitz.Point(endRect.x, endRect.y)
bottom_left = fitz.Point(startRect.x, endRect.y)
# List of points for polyline (closing the rectangle)
rect_points = [top_left, top_right, bottom_right, bottom_left, top_left]
# Add polyline annotation
annot = page.add_polyline_annot(rect_points)
annot.set_colors(stroke=(75/255, 0, 130/255), fill=(75/255, 0, 130/255))
annot.set_opacity(0.9)
annot.set_border(width=20)
annot.set_info(content=str(perimeter)+' m', subject='Perimeter Measurement', title="ADR Team")
annot.update()
page_width = page.rect.width
page_height = page.rect.height
startLength = fitz.Point(0, page_height / 2) *derotationMatrix # left side
endLength = fitz.Point(page_width, page_height / 2) *derotationMatrix # right side
print(f"Line length: {length} points")
# startLength = startLength * derotationMatrix
# endLength = endLength * derotationMatrix
shapeLength=[startLength, endLength]
line_annot = page.add_polyline_annot(shapeLength)
line_annot.set_colors(stroke=(75/255, 0, 130/255)) # red line
line_annot.set_border(width=10)
line_annot.set_info(content=str(length)+' m',subject='Perimeter Measurement', title="ADR Team")
line_annot.update()
# Apply the transformation to the text annotation (shift and scale its position)
text = """Scale Document"""
annot1 = page.add_freetext_annot(rectText, text, fontsize=45, fontname='helv', border_color=(1, 1, 1),text_color=(1, 1, 1), rotate=page.rotation, align=1)
annot1.update()
# doc.save('drawnOn_transformed.pdf')
return doc, area, perimeter