สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

ตอบกระทู้

รูปแสดงอารมณ์
:icon_plusone: :like: :plusone: :gfb: :-D :) :( :-o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :angry: :baa: :biggrin:
รูปแสดงอารมณ์อื่นๆ

BBCode เปิด
[img] เปิด
[url] เปิด
[Smile icon] เปิด

กระทู้แนะนำ
   

มุมมองที่ขยายได้ กระทู้แนะนำ: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย fonfonn » 16/08/2022 7:21 pm

จากที่พี่อธิบายเพิ่มเติม และทดสอบการใช้งาน สามารถทำการแปลงไฟล์และบันทึกไฟล์ในโฟร์เดอร์ที่สร้างได้แล้วค่ะ

โค้ด: เลือกทั้งหมด

pdf_b64 = input() #ทดสอบด้วยกับรับ Input base64 ของไฟล์ PDF

dt = datetime.now()
ts = str(datetime.timestamp(dt))
directory = "pdf_to_image" + ts
parent_dir = r"C:\Users\fonfo\PycharmProjects\pythonProject13"
path = os.path.join(parent_dir, directory)
os.mkdir(path)
attach_fname = 'bo.pdf'
attach_fname_jpj = attach_fname.replace(".pdf", ".jpeg")
jpeg_report_path = os.path.join(path, attach_fname_jpj)
fname_new = ' "' + jpeg_report_path + '"'
pdf_report_path = os.path.join(path, attach_fname)
with open(pdf_report_path, 'wb') as theFile:
     theFile.write(base64.b64decode(pdf_b64))

process = subprocess.Popen(r'Magick convert ' + pdf_report_path + fname_new,
                               stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()

file_len = len([name for name in os.listdir(path) if
                    os.path.isfile(os.path.join(path, name))])  # นับไฟล์ที่อยู่ในโฟล์เดอร์ที่เราสร้างขึ้น

image_base_64 = []
for no in range(file_len -1):
    if file_len > 2:
        new = "-%s.jpeg" % no
    else:
        new = ".jpeg"
    name_jpg = attach_fname.replace(".pdf", new)
    jpeg_report_path = os.path.join(path, name_jpg)
    with open(jpeg_report_path, "rb") as image_file:
        image_base_64.append({
            'base64': base64.b64encode(image_file.read()),
        })
        #ส่วนของการลบไฟล์และโฟร์เดอร์ที่สร้างขึ้น
    os.unlink(jpeg_report_path) 
os.unlink(pdf_report_path)
os.rmdir(path)

#สั่งให้แสดงผล base64 ของภาพที่แปลงได้
print(image_base_64)

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย fonfonn » 16/08/2022 5:40 pm

จากที่พี่มาแปะโค้ดมาให้ ยังงงๆการทำงานอยู่ค่ะ รบกวนอธิบายทีค่ะ ว่ามันใช้งานยังไงในแต่ละส่วน ของฟังก์ชัน หยิบไปใช้งานไม่ถูกเลยอยากให้อธิบายทีค่ะ

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย MBMoo » 16/08/2022 2:55 pm

โค้ด: เลือกทั้งหมด

    def bo(self):
    	out , dir, file_len = self.pdf_to_image
    	image_base_64 = self.image_to_base64(out , dir, file_len)
    	return image_base_64
    
    def pdf_to_image(self):
    	attach_fname = 'bo.pdf'
        attach_fname_jpj = attach_fname.replace(".pdf", ".jpeg")
        dir = self.create_dir()
        jpeg_report_path = os.path.join(dir, attach_fname_jpj)
        fname_new = ' "' + jpeg_report_path + '"'
        if company:
            density = company.md_btn_sale_line_tmp_image
        pdf_report_path = os.path.join(dir, attach_fname)
        with open(pdf_report_path, 'wb') as theFile:
            theFile.write(base64.b64decode(attach_datas))
        
        process = subprocess.Popen(r'Magick convert -verbose -density  '+ pdf_report_path + fname_new,
                    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = process.communicate()
       
        file_len = len([name for name in os.listdir(dir) if os.path.isfile(os.path.join(dir, name))]) # นับไฟล์ที่อยู่ในโฟล์เดอร์ที่เราสร้างขึ้น
        return out , dir, file_len - 1 # ที่เอามาลบ 1 เพราะมี pdf อยู่ด้วย ถ้าแยกเก็บคนละโฟล์เดอร์ไม่ต้องลบก็ได้

    def create_dir(self):
        dt = datetime.now()
        ts = str(datetime.timestamp(dt))
        directory = "md_pdf_to_image" + ts
        parent_dir = os.path.join(r"D:\path", self._cr.dbname)
        path = os.path.join(parent_dir, directory)
        os.mkdir(path)
        return path

    def image_to_base64(self, out, dir, file_len):
        image_base_64 = []
        store = False
        for no in range(file_len):
            new = "-%s.jpeg" % no
            name_jpg = attach_fname.replace(".pdf", new)
            jpeg_report_path = os.path.join(dir, name_jpg)
            with open(jpeg_report_path, "rb") as image_file:
                image_base_64.append({
                                'base64':  base64.b64encode(image_file.read()),
                            })
            os.rmdir(dir)
        return image_base_64

ค่าใน image_base_64 ที่ได้

โค้ด: เลือกทั้งหมด

[{'base64':  base64_str}, {'base64':  base64_str}, {'base64':  base64_str}]

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย fonfonn » 16/08/2022 12:29 pm

จากโค้ดนี้ที่มีการสร้างโฟร์เดอร์ แบบ timestamp

โค้ด: เลือกทั้งหมด

def create_dir():
    dt = datetime.now()
    ts = str(datetime.timestamp(dt))
    directory = "pdf_to_image" + ts
    parent_dir = r"C:\Users\fonfo\PycharmProjects\pythonProject13"
    path = os.path.join(parent_dir, directory)
    os.mkdir(path)
    return path
และมีการแปลงไฟล์ PDF เป็นภาพ

โค้ด: เลือกทั้งหมด

process = subprocess.Popen(r"Magick convert C:\Users\fonfo\PycharmProjects\pythonProject13\testPDF.pdf C:\Users\fonfo\PycharmProjects\pythonProject13\testPDF.jpg", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
นำไฟล์ที่แปลงได้เก็บใน โฟร์เดอร์ที่สร้าง

โค้ด: เลือกทั้งหมด

shutil.move(r"C:\Users\fonfo\PycharmProjects\pythonProject13\testPDF.jpg" ,create_dir())
จะได้ไฟล์ภาพที่แปลงแล้วมาเก็บในโฟร์เดอร์ แต่ว่าถ้าเป็นการแปลง PDF หลายหน้า จะไม่ถูกเก็บในโฟร์เดอร์ที่สร้างขึ้น จะถูกเก็บนอกโฟร์เดอร์แทน
2022-08-16.png
2022-08-16.png (131.63 KiB) Viewed 864 times
เลยอยากรู้ว่านำภาพทั้งที่แปลงได้หลายๆไฟล์มาเก็บในโฟร์เดอร์ เพื่อนับไฟล์ที่แปลงได้คือแบบไหนคะ ปรับแก้ตรงไหน เพื่อจะทำการนับจำนวนไฟล์ที่สร้างขึ้นมา

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย MBMoo » 16/08/2022 11:05 am

ตัวอย่างการสร้าง

โค้ด: เลือกทั้งหมด

from datetime import datetime

 def md_create_dir(self):
        dt = datetime.now()
        ts = str(datetime.timestamp(dt))
        directory = "md_pdf_to_image" + ts
        parent_dir = r"D:\path\path"
        path = os.path.join(parent_dir, directory)
        os.mkdir(path)
        return path

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย fonfonn » 16/08/2022 10:37 am

bolue เขียน: 15/08/2022 7:17 pm สร้างโฟล์เดอร์ตามเวลามาตัวนึง แล้วนับไฟล์ในโฟล์เดอร์เอา หลังจากดึงข้อมูลแล้วให้ลบทั้งโฟล์เดอร์ออก
สอบถามค่ะ มีตัวอย่างการทำงานไหมคะ เพราะว่าตอนนี้ ในการสร้างโฟร์เดอร์ รู้แค่เพียง ใช้

โค้ด: เลือกทั้งหมด

import os
os.makedirs('ชื่อโฟร์เดอร์')
เลยอยากรู้ว่าการสร้างโฟร์ที่เป็น timestamp ใช้ยังไงค่ะ

ที่ทดลองทำคือ แต่ไม่ได้ค่ะ

โค้ด: เลือกทั้งหมด

from datetime import datetime
import os
date = datetime.now().strftime("%Y_%m_%d-%I:%M:%S_%p")
os.makedirs(date)
หรือรบกวนแปะโค้ดตัวอย่างการทำงาน ให้ทีค่ะ

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย MBMoo » 15/08/2022 7:17 pm

สร้างโฟล์เดอร์ตามเวลามาตัวนึง แล้วนับไฟล์ในโฟล์เดอร์เอา หลังจากดึงข้อมูลแล้วให้ลบทั้งโฟล์เดอร์ออก

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย fonfonn » 15/08/2022 12:47 pm

สอบถามเพิ่มเติมค่ะ ในการแปลงไฟล์ PDF ที่มีหลายหลายหน้า จะได้ไฟล์รูปหลายรูป เราจะสามารถรู้หรือดึงจำนวนที่แปลงออกมาได้ยังไงคะว่ามีกี่ไฟล์ที่ถูกแปลงออกมา ค่ะ
เช่น ไฟล์ PDF มี 3 หน้า ก็จะได้ รูปภาพ 3 รูป หรือ ไฟล์ PDF 5 หน้า ก็จะมีไฟล์รูป 5 ไฟล์ แบบนี้ค่ะ

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย wkid » 15/08/2022 10:35 am

โค้ด: เลือกทั้งหมด

[{\"base64\": \"0.0.0.0\", \"type\": \"jpg\"}, {\"base64\": \"0.0.0.0\", \"type\": \"jpg\"}, {\"base64\": \"0.0.0.0\", \"type\": \"jpg\"}]
ส่วนตรงนี้ให้สร้างลิส มาเก็บค่าของดิกที่เราได้ในแต่ละหน้าไปก่อนครับ แล้วนำมาเพิ่มแทนตรงส่วนนี้ครับ

Re: สอบถามการส่งค่า กลับเป็น base64 ในภาษา python

โดย fonfonn » 15/08/2022 10:17 am

wkid เขียน: 15/08/2022 9:37 am ถ้าใส่ ใส่ตรง รีเทิร์นครับสำหรับโค้ดส่วนนี้ เพราะเป็นโค้ดในส่วนที่ส่งกลับไปหลายๆข้อมูลครับครับ

โค้ด: เลือกทั้งหมด

@app.post('/api_pdftopic')
async def read_pdf(request: Pdf_base64):
    with open(r'C:\Users\fonfo\pdf-toolkits\pythonPDF.pdf', 'wb') as theFile:
        theFile.write(base64.b64decode(request.pdf_base64))
    process = subprocess.Popen(r"Magick convert C:\Users\fonfo\pdf-toolkits\pythonPDF.pdf C:\Users\fonfo\pdf-toolkits\pythonPDF.jpg",
                               stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = process.communicate()
    
    return json.dumps({'data': [{'base64': '0.0.0.0' , 'type':'jpg'}, 
                                {'base64': '0.0.0.0' , 'type':'jpg'}, 
                                {'base64': '0.0.0.0' , 'type':'jpg'},]})
ลองใส่ตรง รีเทิร์นค่ะ ค่าที่รีเทิร์นมาจะเป็น

โค้ด: เลือกทั้งหมด

"{\"data\": [{\"base64\": \"0.0.0.0\", \"type\": \"jpg\"}, {\"base64\": \"0.0.0.0\", \"type\": \"jpg\"}, {\"base64\": \"0.0.0.0\", \"type\": \"jpg\"}]}"
เลยสงสัยว่า ต้องแก้ไขหรือเพิ่มในส่วนไหนค่ะ

ข้างบน