尝试使用 KivyMD 和 Python 显示 PDF 文件
Try to display PDF File with KivyMD and Python
我正在尝试构建一个非常简单的应用程序 Python/KivyMD 来整理一些文档。
有没有显示PDF文档的解决方案?我在很多地方都在寻找,但在这个阶段,没有发现任何令人信服的东西......
有没有人有想法(肯定比我的好?)
非常感谢
是的,有一些,但大多数时候真正的答案不在同一个地方,而是在不同的地方,我会给你一些关于如何做到这一点的细节:
jbsidis
- 将 Pyjnius 添加到您的规范要求中,这有助于访问 java 类:
requirements =
kivy==2.0.0,kivymd==0.104.1,python3,pyjnius,plyer,requests,urllib3,chardet,idna,pip,Image,PIL
- 从 https://pdfbox.apache.org/download.html 下载 .jar 插件,这将使您轻松访问有助于您的功能:
Extract Text
Extract Unicode text from PDF files.
Split & Merge
Split a single PDF into many files or merge multiple PDF files.
Fill Forms
Extract data from PDF forms or fill a PDF form.
Preflight
Validate PDF files against the PDF/A-1b standard.
Print
Print a PDF file using the standard Java printing API.
Save as Image
Save PDFs as image files, such as PNG or JPEG.
Create PDFs
Create a PDF from scratch, with embedded fonts and images.
Signing
Digitally sign PDF files.
您必须将该插件添加到您的应用包中。
如果一切设置正确,最简单的部分现在来了(除了 Apache 插件,您还可以使用设备的 NDK 中的原生 类,您将编译应用程序用于: android、ios、等等)
从插件中学习API,如果要使用Apache插件,阅读:https://pdfbox.apache.org/docs/2.0.13/javadocs/
使用 KivyMD 和 Python3 编写图形用户界面,也使用 pyjnius:https://pyjnius.readthedocs.io/en/stable/
我对组织PDF的建议是使用GridLayout,比如有图片但放MDCards加文本标签:
from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
Window.size = (330, 500)
kv = '''
#:import MDTextField kivymd.uix.textfield.MDTextField
<MyTile@SmartTileWithLabel>
size_hint_y: None
height: "240dp"
<S>:
MDTextFieldRound:
pos_hint: {"center_x": .5, "center_y": .95}
normal_color : [1,1,1,.1]
color_active : [1,1,1,1]
size_hint: .8, .07
hint_text : 'Search a product...'
icon_left : 'magnify'
Screen:
FloatLayout:
BoxLayout:
id: m5
pos_hint: {"center_x": .5, "center_y": .371} #this will change if you change this Window.size = (330, 500)
orientation: "vertical"
ScrollView:
GridLayout:
cols: 2
adaptive_height: True
padding: dp(4), dp(4)
spacing: dp(4)
MDCard:
size: "150dp","200dp"
MDLabel:
text: " PDF Book"
MDIconButton:
icon: "file"
MDCard:
size: "150dp","200dp"
MDLabel:
text: " PDF Book"
MDIconButton:
icon: "file"
MDCard:
size: "150dp","200dp"
MDLabel:
text: " PDF Book"
MDIconButton:
icon: "file"
MDCard:
size: "150dp","200dp"
MDLabel:
text: " PDF Book"
MDIconButton:
icon: "file"
MDCard:
size: "150dp","200dp"
MDLabel:
text: ""
MDIconButton:
icon: "file"
## MyTile:
## source: "Photos/pro.jpg"
## text: "[size=26]jbsidis[/size]\n[size=14]cat-1.jpg[/size]"
##
## MyTile:
## source: "Photos/pro.jpg"
## text: "[size=26]jbsidis[/size]\n[size=14]cat-2.jpg[/size]"
## tile_text_color: app.theme_cls.accent_color
##
## MyTile:
## source: "Photos/pro.jpg"
## text: "[size=26][color=#ffffff]jbsidis[/color][/size]\n[size=14]cat-3.jpg[/size]"
## tile_text_color: app.theme_cls.accent_color
MyTile:
source: "a11.png"
text: ""
tile_text_color: [0,0,0,0]
FloatLayout:
AnchorLayout:
pos_hint: {"center_x": .5, "center_y": .9}
MDTextButton:
halign: "center"
text: "\n\n\n\n\n\n\nLoading more...\n\n"
MDSpinner:
size_hint: .1,.1
MDToolbar:
id: success_screen_toolbar
title: "jbsidis"
pos_hint: {"top": 1}
right_action_items: [["progress-check", lambda: print(6)]]
MDBottomAppBar:
MDToolbar:
id: success_screen_bottomappbar
icon: "magnify"
on_action_button: root.add_widget(app.sbar())
type: 'bottom'
mode: 'center'
#elevation: '8dp'
left_action_items: [["calendar-text", lambda: print(6)], ["account-group", lambda: print(6)]]
right_action_items: [["magnify", lambda: print(6)], ["menu", lambda: print(6)]]
'''
class blanks1(BoxLayout):
pass
class S(FloatLayout):
pass
class Main(MDApp):
def build(self):
return Builder.load_string(kv)
def sbar(self):
self.root.ids.success_screen_toolbar.md_bg_color=[1,1,1,1]
return S()
Main().run()
然后,在 python 代码中,我们应该使用 pyjnius 定义函数,这将使 java 插件 类 对 PDF 文件进行操作,我们必须将其与 KivyMD 结合GUI使其可操作,从来都不是不可能的,我们需要的是创造力:
我正在尝试构建一个非常简单的应用程序 Python/KivyMD 来整理一些文档。 有没有显示PDF文档的解决方案?我在很多地方都在寻找,但在这个阶段,没有发现任何令人信服的东西...... 有没有人有想法(肯定比我的好?) 非常感谢
是的,有一些,但大多数时候真正的答案不在同一个地方,而是在不同的地方,我会给你一些关于如何做到这一点的细节: jbsidis
- 将 Pyjnius 添加到您的规范要求中,这有助于访问 java 类:
requirements = kivy==2.0.0,kivymd==0.104.1,python3,pyjnius,plyer,requests,urllib3,chardet,idna,pip,Image,PIL
- 从 https://pdfbox.apache.org/download.html 下载 .jar 插件,这将使您轻松访问有助于您的功能:
Extract Text Extract Unicode text from PDF files. Split & Merge Split a single PDF into many files or merge multiple PDF files. Fill Forms Extract data from PDF forms or fill a PDF form. Preflight Validate PDF files against the PDF/A-1b standard. Print Print a PDF file using the standard Java printing API. Save as Image Save PDFs as image files, such as PNG or JPEG. Create PDFs Create a PDF from scratch, with embedded fonts and images. Signing Digitally sign PDF files.
您必须将该插件添加到您的应用包中。
如果一切设置正确,最简单的部分现在来了(除了 Apache 插件,您还可以使用设备的 NDK 中的原生 类,您将编译应用程序用于: android、ios、等等)
从插件中学习API,如果要使用Apache插件,阅读:https://pdfbox.apache.org/docs/2.0.13/javadocs/
使用 KivyMD 和 Python3 编写图形用户界面,也使用 pyjnius:https://pyjnius.readthedocs.io/en/stable/
我对组织PDF的建议是使用GridLayout,比如有图片但放MDCards加文本标签:
from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
Window.size = (330, 500)
kv = '''
#:import MDTextField kivymd.uix.textfield.MDTextField
<MyTile@SmartTileWithLabel>
size_hint_y: None
height: "240dp"
<S>:
MDTextFieldRound:
pos_hint: {"center_x": .5, "center_y": .95}
normal_color : [1,1,1,.1]
color_active : [1,1,1,1]
size_hint: .8, .07
hint_text : 'Search a product...'
icon_left : 'magnify'
Screen:
FloatLayout:
BoxLayout:
id: m5
pos_hint: {"center_x": .5, "center_y": .371} #this will change if you change this Window.size = (330, 500)
orientation: "vertical"
ScrollView:
GridLayout:
cols: 2
adaptive_height: True
padding: dp(4), dp(4)
spacing: dp(4)
MDCard:
size: "150dp","200dp"
MDLabel:
text: " PDF Book"
MDIconButton:
icon: "file"
MDCard:
size: "150dp","200dp"
MDLabel:
text: " PDF Book"
MDIconButton:
icon: "file"
MDCard:
size: "150dp","200dp"
MDLabel:
text: " PDF Book"
MDIconButton:
icon: "file"
MDCard:
size: "150dp","200dp"
MDLabel:
text: " PDF Book"
MDIconButton:
icon: "file"
MDCard:
size: "150dp","200dp"
MDLabel:
text: ""
MDIconButton:
icon: "file"
## MyTile:
## source: "Photos/pro.jpg"
## text: "[size=26]jbsidis[/size]\n[size=14]cat-1.jpg[/size]"
##
## MyTile:
## source: "Photos/pro.jpg"
## text: "[size=26]jbsidis[/size]\n[size=14]cat-2.jpg[/size]"
## tile_text_color: app.theme_cls.accent_color
##
## MyTile:
## source: "Photos/pro.jpg"
## text: "[size=26][color=#ffffff]jbsidis[/color][/size]\n[size=14]cat-3.jpg[/size]"
## tile_text_color: app.theme_cls.accent_color
MyTile:
source: "a11.png"
text: ""
tile_text_color: [0,0,0,0]
FloatLayout:
AnchorLayout:
pos_hint: {"center_x": .5, "center_y": .9}
MDTextButton:
halign: "center"
text: "\n\n\n\n\n\n\nLoading more...\n\n"
MDSpinner:
size_hint: .1,.1
MDToolbar:
id: success_screen_toolbar
title: "jbsidis"
pos_hint: {"top": 1}
right_action_items: [["progress-check", lambda: print(6)]]
MDBottomAppBar:
MDToolbar:
id: success_screen_bottomappbar
icon: "magnify"
on_action_button: root.add_widget(app.sbar())
type: 'bottom'
mode: 'center'
#elevation: '8dp'
left_action_items: [["calendar-text", lambda: print(6)], ["account-group", lambda: print(6)]]
right_action_items: [["magnify", lambda: print(6)], ["menu", lambda: print(6)]]
'''
class blanks1(BoxLayout):
pass
class S(FloatLayout):
pass
class Main(MDApp):
def build(self):
return Builder.load_string(kv)
def sbar(self):
self.root.ids.success_screen_toolbar.md_bg_color=[1,1,1,1]
return S()
Main().run()
然后,在 python 代码中,我们应该使用 pyjnius 定义函数,这将使 java 插件 类 对 PDF 文件进行操作,我们必须将其与 KivyMD 结合GUI使其可操作,从来都不是不可能的,我们需要的是创造力: