|
|
|
Как сканировать программно QR-Код 1С Ø (Волшебник 07.08.2024 17:57) |
☑ | ||
|---|---|---|---|---|
|
0
SpLorT
07.08.24
✎
19:17
|
Тема такая: Пользователь отправляет в чат-бот телеграм фото QR-кода. 1С на сервере формирует из телеграма фото на сервер. Как мне получить данные QR-кода с картинки, которую 1С создает на сервере?
|
|||
|
1
Ненавижу 1С
гуру
07.08.24
✎
08:46
|
(0) просто интересно - откуда пользователь берет фото qr-кода
|
|||
|
2
CepeLLlka
07.08.24
✎
09:03
|
Вероятно нужна либо библиотека которая сможет это сделать, либо нужно воспользоваться каким-нибудь сторонним сервисом.
Попробуйте погуглить. Вот по первой ссылке такой сервис мне попался https://dewiar.com/publication/107 |
|||
|
3
maxab72
07.08.24
✎
09:05
|
(0) есть приложения, разной степени бесплатности, для расшифровки qr-кодов из картинок. вот в него и скидывать эту картинку.
|
|||
|
4
SpLorT
07.08.24
✎
19:17
|
(1) я ведь указал из 1С при печати документа формируется QR-код
|
|||
|
5
SpLorT
07.08.24
✎
19:16
|
(3) А как скинуть и какие приложения? дайте пример, пожалуйста
|
|||
|
6
SpLorT
07.08.24
✎
19:16
|
(2) Весь интернет перерыл, пришёл сюда писать, может кто знает
|
|||
|
7
SpLorT
07.08.24
✎
19:16
|
(2) за ссылку спасибо, попробую
|
|||
|
8
Builder
07.08.24
✎
10:24
|
(4) Интересно, QR-код формируется в той-же базе 1С или все-таки нет?
|
|||
|
9
maxab72
07.08.24
✎
10:47
|
(5) Во втором ответе как пример. по запросу "api для разбора qr-кодов" ссылок сразу несколько вылазит.
|
|||
|
10
alex73
07.08.24
✎
11:09
|
У нас была похожая задача с чеками самозанятых. Решили ее по-другому - стали запрашивать у контрагента на QR-код, а сразу ссылку на чек на сайте ФНС, которую QR-код в нашем случае содержал. А если разбирать именно сам QR-код - выше правильно написали про стороннее приложение. Довольно много (с полдюжины) статей по этой теме на ИС.
|
|||
|
11
Garykom
гуру
07.08.24
✎
13:03
|
(0)
Примерно такpackage main
import (
"fmt"
"image"
"image/png"
"io"
"os"
"path/filepath"
"github.com/h2non/filetype"
"github.com/makiuchi-d/gozxing"
"github.com/makiuchi-d/gozxing/qrcode"
"github.com/sunshineplan/imgconv"
"github.com/sunshineplan/pdf"
)
func check(e error) {
if e != nil {
panic(e)
}
}
func getParams() (inFile, outFile string) {
params := os.Args[1:]
if len(params) != 2 {
fmt.Println("Требутся два параметра!\r Входной файл (картинка) и выходной файл (данные QR).")
panic("Не хватает параметров!")
//params = append(params, "qrcode.pdf")
//params = append(params, "qrcode.jpg")
//params = append(params, "qrcode.png")
//params = append(params, "qrcode.txt")
}
inFile = params[0]
outFile = params[1]
return
}
func matchFileType(inFile string) string {
buf, _ := os.ReadFile(inFile)
kind, _ := filetype.Match(buf)
if kind == filetype.Unknown {
fmt.Println("Unknown file type")
//return kind.Extension
}
//fmt.Printf("File type: %s. MIME: %s\n", kind.Extension, kind.MIME.Value)
return kind.Extension
}
func decodeQR(file io.Reader) string {
img, imgType, err := image.Decode(file)
check(err)
fmt.Print("Image type = ")
fmt.Println(imgType)
bmp, err := gozxing.NewBinaryBitmapFromImage(img)
check(err)
qrReader := qrcode.NewQRCodeReader()
result, err := qrReader.Decode(bmp, nil)
check(err)
return result.String()
}
func decodeQRBySting(inFile string) string {
file, err := os.Open(inFile)
check(err)
result := decodeQR(file)
return result
}
func convertImageFileToPNG(inFile string, outFile string) {
src, err := imgconv.Open(inFile)
check(err)
err = imgconv.Save(outFile, src, &imgconv.FormatOption{Format: imgconv.PNG})
check(err)
fmt.Print("Convert \"")
fmt.Print(inFile)
fmt.Print("\" to \"")
fmt.Println(outFile)
}
func convertPDFtoPNG(inFile string) (fileNames []string) {
file, err := os.Open(inFile)
check(err)
imgs, err := pdf.DecodeAll(file)
check(err)
tmpDir, err := os.MkdirTemp(os.TempDir(), "fitz_")
check(err)
for n, img := range imgs {
f, err := os.Create(filepath.Join(tmpDir, fmt.Sprintf("test%03d.png", n)))
check(err)
err = png.Encode(f, img)
check(err)
fmt.Println(f.Name())
fileNames = append(fileNames, f.Name())
}
return
}
func main() {
inFile, outFile := getParams()
f, err := os.Create(outFile)
check(err)
defer f.Close()
var fileNames []string
mimeType := matchFileType(inFile)
if mimeType == "png" {
fileNames = append(fileNames, inFile)
} else if mimeType == "pdf" {
fileNames = convertPDFtoPNG(inFile)
} else {
tempFile, err := os.CreateTemp("", "img_*.png")
check(err)
convertImageFileToPNG(inFile, tempFile.Name())
fileNames = append(fileNames, tempFile.Name())
}
qrcode := ""
for _, fileName := range fileNames {
qrcode = decodeQRBySting(fileName)
fmt.Print("QR = ")
fmt.Println(qrcode)
if qrcode != "" {
break
}
}
_, err = f.WriteString(qrcode)
check(err)
for _, fileName := range fileNames {
os.Remove(fileName)
}
}Использование из 1С выглядит так&НаСервере
Функция РаспознатьQRИзКартинкиНаСервере(ИмяФайлаКартинки)
ИмяВременногоКаталога = ПолучитьИмяВременногоФайла();
Попытка
СоздатьКаталог(ИмяВременногоКаталога);
Исключение
КонецПопытки;
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ДвоичныеДанные = ОбработкаОбъект.ПолучитьМакет("gozxing");
ИмяФайлаПриложения = ИмяВременногоКаталога + "\gozxing.exe";
Попытка
ДвоичныеДанные.Записать(ИмяФайлаПриложения);
Исключение
КонецПопытки;
ИмяФайлаШтрихкода = ПолучитьИмяВременногоФайла("txt");
ШаблонКоманды = "%1 %2 %3";
СтрокаКоманды = СтрШаблон(ШаблонКоманды, ИмяФайлаПриложения, ИмяФайлаКартинки, ИмяФайлаШтрихкода);
ТекущийКаталог = ИмяВременногоКаталога;
ДождатьсяЗавершения = Истина;
КодВозврата = "";
Попытка
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата);
Исключение
КонецПопытки;
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаШтрихкода, КодировкаТекста.UTF8);
Штрихкод = СокрЛП(ЧтениеТекста.Прочитать());
ЧтениеТекста.Закрыть();
ЧтениеТекста = Неопределено;
Попытка
УдалитьФайлы(ИмяФайлаКартинки);
Исключение
КонецПопытки;
Попытка
УдалитьФайлы(ИмяФайлаПриложения);
Исключение
КонецПопытки;
Попытка
УдалитьФайлы(ИмяВременногоКаталога);
Исключение
КонецПопытки;
Попытка
УдалитьФайлы(ИмяФайлаШтрихкода);
Исключение
КонецПопытки;
Возврат Штрихкод;
КонецФункции |
|||
|
12
SpLorT
07.08.24
✎
13:08
|
Спасибо огромное вам:) (11)
|
|||
|
13
SpLorT
07.08.24
✎
19:16
|
Подскажите? а что за макет gozxing у вас? я могу ведь сам макет прописать?
|
|||
|
14
Garykom
гуру
07.08.24
✎
13:30
|
(13) макет gozxing - это скомпилированный бинарник на Golang, исходный код которого выше
фактически это просто консольное приложение, которое запускается с двумя параметрами ИмяФайлаКартинки и ИмяТекстовогоФайлаРезультатаРаспознанногоQR как скомпилировать https://proglib.io/p/samouchitel-po-go-dlya-nachinayushchih-chast-3-organizaciya-koda-pakety-importy-moduli-vvod-vyvod-teksta-2023-12-07 |
|||
|
15
SpLorT
07.08.24
✎
19:16
|
Мне нужно что-то скачивать для этого? (13)
|
|||
|
16
Garykom
гуру
07.08.24
✎
14:12
|
(15) Да нужно
https://go.dev/doc/install ну и go get скачает нужные либы с github.com Но это только для компиляции в .exe, потом в макет прицепил .exe и больше ничего не надо |
|||
|
17
Garykom
гуру
07.08.24
✎
14:14
|
На ИС есть другие примеры использования ZXing
Но там еще сложней и хуже |
|||
|
18
SpLorT
07.08.24
✎
19:16
|
Понял, спасибо
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |