主頁 > 後端開發 > Python生成PDF:Reportlab的六種使用方式

Python生成PDF:Reportlab的六種使用方式

2023-03-03 07:19:12 後端開發

 

Reportlab是Python創建PDF檔案的功能庫

這里是整理過的六種Reportlab使用方式,主要參考的是《ReportLab User Guide》

 

一、使用檔案模板DocTemplate

Reportlab的基礎使用方式是創建內容塊(Flowable),再使用檔案模板(DocTemplate)創建Pdf檔案,

 

關注點:

  • Paragraph(段落)
  • Image(影像)
  • Table(表格)
  • VerticalBarChart(柱形圖表)

 

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, SimpleDocTemplate, Image, Table
from reportlab.platypus import Spacer
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.graphics.charts.legends import Legend
from reportlab.lib import  colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm

def draw_text(st, text: str):
    return Paragraph(text, st)
 
def draw_img(path):
    img = Image(path)       # 讀取指定路徑下的圖片
    img.drawWidth = 6*cm    # 設定圖片的寬度
    img.drawHeight = 5*cm   # 設定圖片的高度
    return img

def draw_table(*args):
    col_width = 120
    style = [
        ('FONTNAME', (0, 0), (-1, -1), 'song'),  # 字體
        ('FONTSIZE', (0, 0), (-1, 0), 12),  # 第一行的字體大小
        ('FONTSIZE', (0, 1), (-1, -1), 10),  # 第二行到最后一行的字體大小
        ('BACKGROUND', (0, 0), (-1, 0), '#d5dae6'),  # 設定第一行背景顏色
        ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 第一行水平居中
        ('ALIGN', (0, 1), (-1, -1), 'LEFT'),  # 第二行到最后一行左右左對齊
        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),  # 所有表格上下居中對齊
        ('TEXTCOLOR', (0, 0), (-1, -1), colors.darkslategray),  # 設定表格內文字顏色
        ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),  # 設定表格框線為grey色,線寬為0.5
        ('SPAN', (0, 1), (2, 1)),  # 合并第二行一二三列
    ]
    table = Table(args, colWidths=col_width, style=style)
    return table
 
def draw_bar(bar_data: list, ax: list, items: list):
    drawing = Drawing(500, 200)
    bc = VerticalBarChart()
    bc.x = 45       # 整個圖表的x坐標
    bc.y = 45      # 整個圖表的y坐標
    bc.height = 150     # 圖表的高度
    bc.width = 350      # 圖表的寬度
    bc.data =https://www.cnblogs.com/windfic/p/ bar_data
    bc.strokeColor = colors.black       # 頂部和右邊軸線的顏色
    bc.valueAxis.valueMin = 0           # 設定y坐標的最小值
    bc.valueAxis.valueMax = 20         # 設定y坐標的最大值
    bc.valueAxis.valueStep = 5         # 設定y坐標的步長
    bc.categoryAxis.labels.dx = 2
    bc.categoryAxis.labels.dy = -8
    bc.categoryAxis.labels.angle = 20
    bc.categoryAxis.labels.fontName = 'song'
    bc.categoryAxis.categoryNames = ax
    
    # 圖示
    leg = Legend()
    leg.fontName = 'song'
    leg.alignment = 'right'
    leg.boxAnchor = 'ne'
    leg.x = 475         # 圖例的x坐標
    leg.y = 140
    leg.dxTextSpace = 10
    leg.columnMaximum = 3
    leg.colorNamePairs = items
    drawing.add(leg)
    drawing.add(bc)
    return drawing
View Code

 

  (所有原始碼下載見后)

二、使用頁面模板PageTemplate

上述的排版都是線性的,如果要有一些混排,比如列式排版,可以使用BalancedColumns,

有一些頁面排版比較復雜,那可以使用頁面模板(PageTemplate),

其實還可以用傳統Web藝能——Table來做排版,我試了一下,只需要指定BOX,GRID為白色即可,線寬為0不行,

 

關注點:

  • PageTemplate(頁面模板)
  • Frame(框架)
from reportlab.lib.colors import Color
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas
from reportlab.lib import  colors
from reportlab.platypus import BaseDocTemplate, Frame, Paragraph, NextPageTemplate, PageBreak, PageTemplate, Image


def draw_text(st, text: str):
    return Paragraph(text, st)
 
 
def draw_img(path):
    img = Image(path)       # 讀取指定路徑下的圖片
    img.drawWidth = 5*cm    # 設定圖片的寬度
    img.drawHeight = 4*cm   # 設定圖片的高度
    return img


def main(filename):
    pdfmetrics.registerFont(TTFont('微軟雅黑', 'msyh.ttf'))
    
    style = getSampleStyleSheet()
    
    ts = style['Heading1']
    ts.fontName = '微軟雅黑'    # 字體名
    ts.fontSize = 18        # 字體大小
    ts.leading = 30         # 行間距
    ts.alignment = 1        # 居中
    ts.bold = True
    
    hs = style['Heading2']
    hs.fontName = '微軟雅黑'    # 字體名
    hs.fontSize = 15        # 字體大小
    hs.leading = 20         # 行間距
    hs.textColor = colors.red  # 字體顏色
    
    ns = style['Normal']
    ns.fontName = '微軟雅黑'
    ns.fontSize = 12
    ns.wordWrap = 'CJK'     # 設定自動換行
    ns.alignment = 0        # 左對齊
    ns.firstLineIndent = 32 # 第一行開頭空格
    ns.leading = 20
    
    doc = BaseDocTemplate(filename, showBoundary=0, pagesize=A4)

    frameT = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal')
    
    w = doc.width / 3
    h = w
    bm = doc.height - h
    frame1 = Frame(doc.leftMargin, bm, w, h, id='col1')
    frame2 = Frame(doc.leftMargin + w, bm, doc.width-w, h, id='col2')
    frame3 = Frame(doc.leftMargin, doc.bottomMargin, doc.width , bm-doc.topMargin, id='col3')
    
    doc.addPageTemplates([
        PageTemplate(id='TwoCol', frames=[frame1, frame2, frame3]),
        PageTemplate(id='OneCol', frames=frameT),
    ])
    
    
    elements = []
    
    
    elements.append(draw_img("images/title.jpg"))
    elements.append(draw_text(ns, ''))
    elements.append(NextPageTemplate('OneCol'))
    elements.append(PageBreak())
    elements.append(draw_text(ns,"Frame one column, "))
    
    doc.build(elements)
View Code

 

三、繼承BaseDocTemplate

前兩種方式都不能精確輸出,依賴于模板的排版,精確輸出需要Canvas介面,

如果你要在每一頁上顯示頁眉和頁腳,那么你可以繼承檔案模板(BaseDocTemplate),

如果你要添加目錄索引,這就是最方便的方式,   覆寫介面:
  • handle_documentBegin
  • handle_pageBegin
  • handle_pageEnd
  • handle_frameBegin
  • handle_frameEnd
  • handle_flowable
  • handle_nextPageTemplate
  • handle_currentFrame
  • handle_nextFrame
  或者實作回呼函式:
  • afterInit
  • beforeDocument
  • beforePage
  • afterPage
  • filterFlowables
  • afterFlowable
 

關注點:

  • BaseDocTemplate(檔案模板)
  • bookmarkPage(書簽)
  • addOutlineEntry(大綱)

 

from reportlab.lib.styles import ParagraphStyle
from reportlab.platypus import PageBreak
from reportlab.platypus.paragraph import Paragraph
from reportlab.platypus.doctemplate import PageTemplate, BaseDocTemplate
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus.frames import Frame
from reportlab.lib.units import cm


class MyDocTemplate(BaseDocTemplate):
    
    def __init__(self, filename, **kw):
        self.allowSplitting = 0
        BaseDocTemplate.__init__(self, filename, **kw)
        template = PageTemplate('normal', [Frame(2.5*cm, 2.5*cm, 15*cm, 25*cm, id='F1')])
        self.addPageTemplates(template)
        self.chapter = 0
        self.section = 0

    def afterFlowable(self, flowable):
        if isinstance(flowable, Paragraph):
            text = flowable.getPlainText()
            style = flowable.style.name
            if style == 'Title':
                self.chapter += 1
                self.canv.bookmarkPage(f"chapter{self.chapter}")
                self.canv.addOutlineEntry(f"Chapter {self.chapter}", f"chapter{self.chapter}", level=0)
            elif style == 'Heading1':
                self.section += 1
                self.canv.bookmarkPage(f"section{self.section}")
                self.canv.addOutlineEntry(f"Section {self.section}", f"section{self.section}", level=1)

def main(filename):
    pdfmetrics.registerFont(TTFont('微軟雅黑', 'msyh.ttf'))
    
    title = ParagraphStyle(name = 'Title',
        fontName = '微軟雅黑',
        fontSize = 22,
        leading = 16,
        alignment = 1,
        spaceAfter = 20)

    h1 = ParagraphStyle(
        name = 'Heading1',
        fontSize = 14,
        leading = 16)

    story = []
    
    story.append(Paragraph('繼承BaseDocTemplate', title))
    story.append(Paragraph('Section 1', h1))
    story.append(Paragraph('Text in Section 1.1'))
    story.append(PageBreak())
    story.append(Paragraph('Section 2', h1))
    story.append(Paragraph('Text in Section 1.2'))
    story.append(PageBreak())
    story.append(Paragraph('Chapter 2', title))
    story.append(Paragraph('Section 1', h1))
    story.append(Paragraph('Text in Section 2.1'))

    doc = MyDocTemplate(filename)
    doc.build(story)
View Code

 

四、使用SimpleDocTemplate

SimpleDocTemplate就是繼承BaseDocTemplate的一種簡單實作,它覆寫了介面handle_pageBegin,多載了build介面,

它把頁面分成兩種:首頁和后續頁,對應回呼兩個程序onFirstPage=, onLaterPages=,只需要實作這兩個回呼程序即可,

適用顯示頁眉和頁腳,其它的功能就有限了,

 

關注點:

  • SimpleDocTemplate(檔案模板)
  • QrCode(二維碼)
  • drawOn(顯示Flowable)

 

from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.platypus import PageBreak
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.colors import Color
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.graphics.barcode import qr

#首頁
def myFirstPage(canvas, doc):
    canvas.saveState()
    canvas.setFillColorRGB(0, 0, 0)
    canvas.setFont('微軟雅黑',12)
    str="(內部資料)"
    canvas.drawCentredString(doc.width/2, 25*mm, str)
    myLaterPages(canvas, doc)
    canvas.restoreState()
    
#頁眉頁腳
def myLaterPages(canvas, doc):
    canvas.saveState()
    canvas.setStrokeColorRGB(0.8, 0.8, 0.8)
    canvas.line(0, 32, doc.width, 32)
    canvas.line(0, A4[1]-45, doc.width, A4[1]-45)
    canvas.setFillColorRGB(0, 0, 0)
    canvas.setFont('微軟雅黑',10)
    str=f"Page {doc.page}"
    canvas.drawCentredString(doc.width/2, 5*mm, str)
    canvas.setFillColorRGB(1, 0, 0)
    canvas.drawCentredString(doc.width/2, A4[1]-9*mm, "XX有限公司著作權所有")
    qr_code = qr.QrCode('https://www.cnblogs.com/windfic', width=45, height=45)
    canvas.setFillColorRGB(0, 0, 0)
    qr_code.drawOn(canvas, 0, A4[1]-45)
    canvas.restoreState()


def main(filename):
    pdfmetrics.registerFont(TTFont('微軟雅黑', 'msyh.ttf'))
    
    doc = SimpleDocTemplate(filename, pagesize=A4, leftMargin=10, rightMargin=10)
    
    title = ParagraphStyle(name = 'Title',
        fontName = '微軟雅黑',
        fontSize = 22,
        leading = 16,
        alignment = 1,
        spaceAfter = 20)

    contents = []
    contents.append(Paragraph('使用SimpleDocTemplate', title))
    contents.append(Paragraph('Hello'))
    contents.append(PageBreak())
    contents.append(Paragraph('World'))
    
    doc.build(contents, onFirstPage=myFirstPage, onLaterPages=myLaterPages)
View Code

五、繼承Canvas

控制Canvas的另一種方法是繼承Canvas,

與繼承檔案模板(DocTemplate)類似,不過網上能找到的例子也就是顯示頁碼,不是很實用,

 

from reportlab.platypus import SimpleDocTemplate, Image, Paragraph, PageBreak
from reportlab.pdfgen import canvas
from reportlab.lib.units import mm
from reportlab.lib.colors import Color
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.styles import ParagraphStyle


class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        canvas.Canvas.__init__(self, *args, **kwargs)
        self._saved_page_states = []

    def showPage(self):
        self._saved_page_states.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        """add page info to each page (page x of y)"""
        num_pages = len(self._saved_page_states)
        for state in self._saved_page_states:
            self.__dict__.update(state)
            self.draw_page_number(num_pages)
            canvas.Canvas.showPage(self)
        canvas.Canvas.save(self)

    def draw_page_number(self, page_count):
        self.setFont("Helvetica", 9)
        self.setStrokeColor(Color(0, 0, 0, alpha=0.5))
        self.line(10*mm, 15*mm, A4[0] - 10*mm, 15*mm)
        self.setFillColor(Color(0, 0, 0, alpha=0.5))
        self.drawCentredString(A4[0]/2, 10*mm, "Page %d of %d" % (self._pageNumber, page_count))
 
def main(filename):
    pdfmetrics.registerFont(TTFont('微軟雅黑', 'msyh.ttf'))
    
    title = ParagraphStyle(name = 'Title',
        fontName = '微軟雅黑',
        fontSize = 22,
        leading = 16,
        alignment = 1,
        spaceAfter = 20)

    image = Image("images/title.jpg")
    image.drawWidth = 160
    image.drawHeight = 160*(image.imageHeight/image.imageWidth)
    elements = [
        Paragraph('繼承Canvas', title),
        Paragraph("Hello"),
        image,
        PageBreak(),
        Paragraph("world"),
    ]
    doc = SimpleDocTemplate(filename)
    doc.build(elements, canvasmaker=NumberedCanvas)
    
View Code

 

六、直接使用Canvas

當你的PDF內容非常復雜,難以用以上的方法實作,可以直接使用Canvas創建PDF

直接使用Canvas類,可以精確輸出,但需要自己排版,而且它的坐標原點在左下角,

其中也可以放置Flowable,需要排版的Flowable,如Table等,呼叫warp函式即可自動排版,

如果是內容已經排版的格式轉換程式,非常推薦使用這種方式,

 

from reportlab.pdfgen import canvas
from reportlab.platypus import Image
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.lib.colors import Color
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont


def draw_page_number(c, page, count):
    c.setFont("微軟雅黑", 9)
    c.setStrokeColor(Color(0, 0, 0, alpha=0.5))
    c.line(10*mm, 15*mm, A4[0] - 10*mm, 15*mm)
    c.setFillColor(Color(0, 0, 0, alpha=0.5))
    c.drawCentredString(A4[0]/2, 10*mm, "Page %d of %d" % (page, count))
 
def main(filename):
    pdfmetrics.registerFont(TTFont('微軟雅黑', 'msyh.ttf'))
    
    c = canvas.Canvas(filename)
    c.bookmarkPage("title")
    c.addOutlineEntry("my book", "title", level=0)
    c.setFont("微軟雅黑", 18)
    c.drawCentredString(A4[0]/2, A4[1] - 50, "單獨使用Canvas")
    c.setFont("微軟雅黑", 12)
    c.drawString(100, A4[1] - 76, "Hello"*100)
    
    img = Image("images/title.jpg")
    img.drawWidth = 160
    img.drawHeight = 160*(img.imageHeight/img.imageWidth)
    img.drawOn(c, 100, A4[1] - 200)
    
    draw_page_number(c, 1, 2)
    c.bookmarkPage("section1")
    c.addOutlineEntry("first section", "section1", level=1)
    c.showPage()
    
    c.drawString(100, A4[1] - 50, "World")
    draw_page_number(c, 2, 2)
    c.bookmarkPage("section2")
    c.addOutlineEntry("second section", "section2", level=1)
    c.showPage()
    
    c.showOutline()
    c.save()
View Code

 

七、總結及原始碼下載

綜合以上六種方式來看,前五種基本上是同一頻道,可以結合起來使用,但第六種,給我個人的感覺是更自在一點,不用去摸索,想怎么來就怎么來,

本來想推薦前五種方式融合的方案,但是當我用第六種方式實作了所有的內容,卻發現代碼更少,更直觀,

因此,對比之下,我更推薦使用第六種方式了,

 

全部原始碼:點此下載

 

(全文完)

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/545535.html

標籤:Python

上一篇:PHP SPL SplFileInfo FilterIterator 輪詢檔案洗掉

下一篇:python django專案配置及啟動

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more