Hướng dẫn python print html to printer - python in html sang máy in

3

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi muốn in tệp HTML thông qua máy in mặc định trên OS Windows Tôi đã thực hiện việc này bằng mã:

import os

os.startfile("C:\\Users\\user\Desktop\\table.html", "print")

Vấn đề là không có màu sắc và không có màu nền cho các trường và trang bảng.

Hướng dẫn python print html to printer - python in html sang máy in

và bảng thực tế trên trình duyệt:

Hướng dẫn python print html to printer - python in html sang máy in

Vậy làm thế nào để in với màu sắc thực tế?

Hỏi ngày 13 tháng 4 năm 2014 lúc 15:22Apr 13, 2014 at 15:22

5

Có thể máy in của bạn mặc định là B & W, nếu vậy, hãy cố gắng thay đổi cài đặt đó và sau đó chạy lại tập lệnh của bạn.

Trước tiên, bạn cũng có thể thử chuyển đổi tệp HTML thành PDF bằng PDFKit:

import os    
import pdfkit
pdfkit.from_file("C:\\Users\\user\Desktop\\table.html", "out.pdf")
os.startfile("out.pdf", "print")

Đã trả lời ngày 5 tháng 5 năm 2015 lúc 15:45May 5, 2015 at 15:45

NIXXXONNIXXXXONNixxxon

Huy hiệu đồng 1481 Bạc9 Huy hiệu Đồng1 silver badge9 bronze badges

Công cụ in gốc

Vào năm 2019, tôi được yêu cầu tạo một giải pháp để in các tấm bảng trên giấy. Các bảng hiệu này chứa số sê -ri, số đơn đặt hàng và các dữ liệu khác liên quan đến giá đỡ với thiết bị máy tính. Dữ liệu này phải được biểu diễn bằng mã QR và mã vạch để kho có thể quét chúng.

Tôi đã được tặng máy tính xách tay Lenovo T470s bị loại bỏ trong bộ phận lắp ráp để nhân sự có thể sử dụng ứng dụng. Bởi vì tôi đã gắn liền với Windows và phải tạo GUI để sử dụng dễ dàng, tôi quyết định tạo một chương trình C# trong Microsoft Visual Studio vì việc tạo GUI cho Windows rất dễ dàng theo cách đó. Nó sẽ tạo các tệp HTML cục bộ bằng cách sử dụng gói NUGET kết xuất mã vạch để tạo mã QR- và Bar và gửi nó đến bộ in được đặt làm mặc định trong Windows. Nó thậm chí đã có một số đăng nhập bằng NLOG. Tôi chỉ đặt tên cho ứng dụng này là "công cụ in".

Bản tin ban đầu được hiển thị bởi ứng dụng C#
The placard rendered by the C# application

Hướng dẫn python print html to printer - python in html sang máy in


Công cụ in được thực hiện lại

Vào năm 2021, tôi quyết định tích hợp công cụ in vào một chương trình khác được viết bằng Python bằng bộ công cụ GUI QT. Chương trình này là một bản viết lại Python của một dự án C# khác của tôi. Và ràng buộc PYQT thực sự cho phép tạo ra GUI đẹp với nhà thiết kế QT.

Đối với mã QR, tôi đã sử dụng mô -đun Python QRCode. Nó dễ dàng tạo các tệp PNG.

Nó đơn giản như:

import qrcode
qrcode.make('1234')

Nhập chế độ FullScreenen EXIT Mode FullScreen

Đối với mã vạch, tôi đã sử dụng mô-đun Python-Barcode.

Trong công cụ in gốc, tôi đã sử dụng các tệp HTML và in chúng. Lớp Webbrowser xử lý in các tài liệu, thuận tiện.

private void PrintDocument(object sender, WebBrowserDocumentCompletedEventArgs e) {
    // Print the document now that it is fully loaded.
    ((WebBrowser)sender).Print();

    // Dispose the WebBrowser now that the task is complete. 
    ((WebBrowser)sender).Dispose();
}

private void PrintHelpPage(Uri uri) {
    logger.Info(String.Format("Print: {0}", uri));
    // Create a WebBrowser instance. 
    WebBrowser webBrowserForPrinting = new WebBrowser();

    // Add an event handler that prints the document after it loads.
    webBrowserForPrinting.DocumentCompleted +=
    new WebBrowserDocumentCompletedEventHandler(PrintDocument);

    // Set the Url property to load the document.
    webBrowserForPrinting.Url = uri;
}

Nhập chế độ FullScreenen EXIT Mode FullScreen

Đối với mã vạch, tôi đã sử dụng mô-đun Python-Barcode.

win32api.ShellExecute(0, 'print', filename, f'/d:"{win32print.GetDefaultPrinter()}"', '.', 0)

Nhập chế độ FullScreenen EXIT Mode FullScreen

Đối với mã vạch, tôi đã sử dụng mô-đun Python-Barcode.

Trong công cụ in gốc, tôi đã sử dụng các tệp HTML và in chúng. Lớp Webbrowser xử lý in các tài liệu, thuận tiện.

""C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"" /p /h "%1" 
%SystemRoot%\system32\NOTEPAD.EXE /p %1
"%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE" /p "%1"
"%systemroot%\system32\mspaint.exe" /p "%1"

Nhập chế độ FullScreenen EXIT Mode FullScreen

Hướng dẫn python print html to printer - python in html sang máy in

Đối với mã vạch, tôi đã sử dụng mô-đun Python-Barcode.

Hướng dẫn python print html to printer - python in html sang máy in

Trong công cụ in gốc, tôi đã sử dụng các tệp HTML và in chúng. Lớp Webbrowser xử lý in các tài liệu, thuận tiện.

Hướng dẫn python print html to printer - python in html sang máy in

Hướng dẫn python print html to printer - python in html sang máy in

Nhưng với Python, điều này đã chứng minh một chút khó khăn. Tôi đã sử dụng mô -đun Win32API để in. Trong đó gọi một ứng dụng được đặt trong Windows Registry để sử dụng in tệp.
Printing an HTML file with notepad or WordPad also did not work.

Hướng dẫn python print html to printer - python in html sang máy in


Python sử dụng động từ "in" này, để cho Windows hướng một tệp đến một máy in. Đây được gọi là một hiệp hội tập tin. Các hiệp hội tập tin này có thể được tìm thấy trong Windows Registry.
On my development laptop, which had Excel installed, the "print" verb for xlsx files was connected to the command:

C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE /q "%1"

Nhập chế độ FullScreenen EXIT Mode FullScreen

Đối với mã vạch, tôi đã sử dụng mô-đun Python-Barcode.

  • Trong công cụ in gốc, tôi đã sử dụng các tệp HTML và in chúng. Lớp Webbrowser xử lý in các tài liệu, thuận tiện.licenses
  • Nhưng với Python, điều này đã chứng minh một chút khó khăn. Tôi đã sử dụng mô -đun Win32API để in. Trong đó gọi một ứng dụng được đặt trong Windows Registry để sử dụng in tệp.storage space
  • Python sử dụng động từ "in" này, để cho Windows hướng một tệp đến một máy in. Đây được gọi là một hiệp hội tập tin. Các hiệp hội tập tin này có thể được tìm thấy trong Windows Registry.performance

Dưới đây là một số ví dụ:

In các tệp HTML được chứng minh là khó khăn. Firefox được sử dụng để có một tham số dòng lệnh để thực hiện việc này, vẫn được tìm thấy trong Windows Registry, nhưng điều này không hoạt động. Các chương trình khác chỉ đơn giản là in ra nguồn HTML.

Tôi đã thử chỉnh sửa động từ in cho các tệp HTML, nhưng không có may mắn.

"%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE" /p "%1"

Nhập chế độ FullScreenen EXIT Mode FullScreen

Đối với mã vạch, tôi đã sử dụng mô-đun Python-Barcode.

Trong công cụ in gốc, tôi đã sử dụng các tệp HTML và in chúng. Lớp Webbrowser xử lý in các tài liệu, thuận tiện..odt extension for OpenDocument files. These files have proven to be the perfect outcome. I could choose between the odfpy module and the relatorio module. With relatorio, I could simply create a template file with OpenOffice Writer. Load the template in Python, fill in the data and images, finally print it.

Đây là một kịch bản độc lập tôi đã tạo trong quá trình thử nghiệm.

import qrcode
import relatorio
from relatorio.templates.opendocument import Template
import tempfile
import time
import win32api
import win32print


def generate_qr(qr_input, data_holder):
    with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as tmpfile:   
        qr = qrcode.make(qr_input)  
        qr.save(tmpfile, qr.format, quality=100)
        print(tmpfile.name)
        return (open(tmpfile.name, 'rb'), 'image/png')

def main():
    inv = {}
    inv['shipmentnumber'] = '6'
    inv['units'] = '3'
    inv['model'] = 'MyModel'
    inv['systemnumber'] = '4'
    inv['productline'] = 'TestLine'
    inv['page'] = '1'
    inv['pagetotal'] = '99'
    inv['ordernumber'] = '9341'
    inv['ordernumberqr'] = generate_qr(inv['ordernumber'], inv)

    basic = Template(source='', filepath='basic.odt')

    with open('placard.odt', 'wb') as f:
        f.write(basic.generate(o=inv).render().getvalue())

    time.sleep(2)
    filename = 'placard.odt'
    print(f'Printing: {filename}')
    win32api.ShellExecute(0, 'print', filename, f'/d:"{win32print.GetDefaultPrinter()}"', '.', 0)

if __name__ == '__main__':
    main()

Nhập chế độ FullScreenen EXIT Mode FullScreen

Mã trên hoạt động tốt, tuy nhiên ...

Khi tôi kiểm tra ứng dụng của mình trên máy tính bảng, nó đã in các hộp đen thay vì hình ảnh. Hóa ra các hình ảnh được nhúng bằng cách sử dụng trình giữ chỗ trong một mẫu được tạo trong Word hoặc OpenOffice Writer, trở nên như thế khi được in bởi WordPad. Trong khi in trên máy phát triển của tôi, tôi vẫn phải sử dụng Word để in các tài liệu này.

Hộp đen ngay khi bạn nghĩ rằng bạn đã hoàn thành ...
Just when you think you were finished...

Hướng dẫn python print html to printer - python in html sang máy in


Tạo tệp ODF

Thay vì điền vào một tệp mẫu với trình giữ chỗ và nhúng hình ảnh, tôi nghĩ ... có lẽ tôi cần tạo tệp ODF từ đầu và chèn hình ảnh trực tiếp hơn là sử dụng trình giữ chỗ. Tôi chuyển sang Odfpy.

Tôi đã tạo tài liệu và xem nó trong WordPad, tất cả đều trông ổn trong chương trình. Nhưng khi in, hộp đen lại xuất hiện.

Đây là mã được sử dụng với ODFPY:

from barcode.codex import Code128
from barcode.writer import ImageWriter
import qrcode

import PIL.Image
from PIL.PngImagePlugin import PngImageFile, PngInfo

from odf.opendocument import OpenDocumentText
from odf import style, text
from odf.text import P
from odf.draw import Frame, Image
from odf.style import Style, GraphicProperties, TableColumnProperties, ParagraphProperties, TableCellProperties
from odf.table import Table, TableColumn, TableRow, TableCell

import io
from os.path import join, dirname
import tempfile
import time
import win32api
import win32print

def generate_qr(qr_input: str):
    qr_name = '' 
    with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as tmpfile:
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=10,
            border=4,
        )
        qr.add_data(qr_input)
        qr.make(fit=True)
        img = qr.make_image(fill_color="black", back_color="white")        
        img = img.convert('RGB')

        pixels = img.load()
        pixels[0, 0] = (255, 0, 0)

        img.save(tmpfile.name, dpi=(96, 96))

        qr_name = tmpfile.name
    return qr_name

def generate_bar(bar_input: str):
    bar_name = ''
    with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as tmpfile:
        Code128(bar_input, writer=ImageWriter(),).write(tmpfile, options={"write_text": False})

        img = PIL.Image.open(tmpfile)
        img = img.convert('RGB')

        pixels = img.load()
        pixels[0, 0] = (255, 0, 0)

        img.save(tmpfile.name, dpi=(96, 96)) 

        bar_name = tmpfile.name
    return bar_name


def main():
    outfp = io.BytesIO()

    textdoc = OpenDocumentText()

    p = P(text="QR code placard")
    textdoc.text.addElement(p)

    # Main table
    tablecontents = Style(name="Table Contents")
    tablecontents.addElement(ParagraphProperties(numberlines="true", linenumber="0"))
    textdoc.styles.addElement(tablecontents)

    widthshort = Style(name="Wshort", family="table-column")
    widthshort.addElement(TableColumnProperties(columnwidth="25%"))
    textdoc.automaticstyles.addElement(widthshort)

    widthwide = Style(name="Wwide", family="table-column")
    widthwide.addElement(TableColumnProperties(columnwidth="25%"))
    textdoc.automaticstyles.addElement(widthwide)

    table = Table()
    table.addElement(TableColumn(numbercolumnsrepeated=4,stylename=widthshort))
    table.addElement(TableColumn(numbercolumnsrepeated=3,stylename=widthwide))

    tr = TableRow()
    table.addElement(tr)
    tc = TableCell()
    tr.addElement(tc)
    tc.addElement(P(stylename=tablecontents,text='Shipment:'))
    tc = TableCell()
    tr.addElement(tc)
    tc.addElement(P(stylename=tablecontents,text=' 2'))
    tc = TableCell()
    tr.addElement(tc)
    tc.addElement(P(stylename=tablecontents,text='System: '))
    tc = TableCell()
    tr.addElement(tc)
    tc.addElement(P(stylename=tablecontents,text=' 3'))

    textdoc.text.addElement(table)

    # separate Images    
    order_number = '12345678'
    qr = generate_qr(order_number)
    p = P()
    textdoc.text.addElement(p)
    photoframe = Frame(width="310px", height="310px")
    print(f'QR: {qr}')
    href = textdoc.addPicture(qr)
    photoframe.addElement(Image(href=href))
    p.addElement(photoframe)

    bar = generate_bar(order_number)
    p = P()
    textdoc.text.addElement(p)
    photoframe = Frame(width="340px", height="120px")
    href = textdoc.addPicture(bar)
    photoframe.addElement(Image(href=href))
    p.addElement(photoframe)

    p = P(text='End of placard')
    textdoc.text.addElement(p)

    time.sleep(1)

    # save tempfile
    with tempfile.NamedTemporaryFile(delete=True) as tmpfile:
        textdoc.save(tmpfile.name, True) 
        print(f'Printing: {tmpfile.name}')    

if __name__ == '__main__':
    main()

Nhập chế độ FullScreenen EXIT Mode FullScreen


Mã trên hoạt động tốt, tuy nhiên ...

Khi tôi kiểm tra ứng dụng của mình trên máy tính bảng, nó đã in các hộp đen thay vì hình ảnh. Hóa ra các hình ảnh được nhúng bằng cách sử dụng trình giữ chỗ trong một mẫu được tạo trong Word hoặc OpenOffice Writer, trở nên như thế khi được in bởi WordPad. Trong khi in trên máy phát triển của tôi, tôi vẫn phải sử dụng Word để in các tài liệu này.

Hộp đen ngay khi bạn nghĩ rằng bạn đã hoàn thành ...

http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html

Tạo tệp ODF

  • Thay vì điền vào một tệp mẫu với trình giữ chỗ và nhúng hình ảnh, tôi nghĩ ... có lẽ tôi cần tạo tệp ODF từ đầu và chèn hình ảnh trực tiếp hơn là sử dụng trình giữ chỗ. Tôi chuyển sang Odfpy.1 bit/sample grayscale
  • Tôi đã tạo tài liệu và xem nó trong WordPad, tất cả đều trông ổn trong chương trình. Nhưng khi in, hộp đen lại xuất hiện.8 bits/sample truecolor

import os    
import pdfkit
pdfkit.from_file("C:\\Users\\user\Desktop\\table.html", "out.pdf")
os.startfile("out.pdf", "print")
0

Nhập chế độ FullScreenen EXIT Mode FullScreen

Đây là mã được sử dụng với ODFPY:

import os    
import pdfkit
pdfkit.from_file("C:\\Users\\user\Desktop\\table.html", "out.pdf")
os.startfile("out.pdf", "print")
1

Nhập chế độ FullScreenen EXIT Mode FullScreen

Nội dung tệp PNG

Sau đó, tôi đã cố gắng mở tệp ODF trong Word, sau đó nhấp chuột phải vào hình ảnh của mã QR và sử dụng "Lưu dưới dạng hình ảnh" và sau đó thêm lại hình ảnh mới này trở lại WordPad. Khi in bằng hình ảnh được thêm lại, mã QR được in đúng cách. Hình ảnh có chất lượng ít hơn một chút, và do đó một chút mờ pixel do các vật phẩm nén. Đây là một manh mối để thực sự giải quyết vấn đề.

import os    
import pdfkit
pdfkit.from_file("C:\\Users\\user\Desktop\\table.html", "out.pdf")
os.startfile("out.pdf", "print")
2

Nhập chế độ FullScreenen EXIT Mode FullScreen

Tôi cũng có thể thêm các tệp PNG khác, cũng được in tốt. Tôi đã kết luận, bản thân hình ảnh PNG phải là vấn đề, không phải là cách xây dựng tài liệu ODF. Cuối cùng, tôi đã tìm thấy một chương trình tiện dụng: twakpng, cụ thể để kiểm tra các tệp PNG. Tôi đã học được rằng các tệp PNG được tạo thành từ các khối.

Tôi đã sử dụng mô -đun thư viện / gối hình ảnh Python để chuyển đổi hình ảnh được tạo thành RGB. Điều này đã thay đổi tiêu đề của nó:


Từ: 1 bit/mẫu màu xám

Into: 8 bit/mẫu truecolor

Tôi cũng đã thử một chế độ chuyển đổi palettised.

Trong đó thêm một bảng màu, nhưng điều này vẫn được in ra một hộp đen.
Testing to see how WordPad printing responds

Hướng dẫn python print html to printer - python in html sang máy in

Tôi đã cố gắng sao chép các khối của PNG đã in, vào các hình ảnh PNG mã QR- và Bar mà Python tạo ra. Công cụ TWEAKPNG và mô -đun PIL đều cho phép dễ dàng thay đổi các khối này.

PIL Tài liệu về điều này: https://pillow.readthedocs.io/en/3.1.x/pil.html?highlight=pnginfo#pil.pngimagePlugin.pnginfo
About WordPad

Hướng dẫn python print html to printer - python in html sang máy in

Nhưng ... vẫn không tốt. Cố gắng sao chép các khối càng gần càng tốt, WordPad vẫn in các hộp đen rắn.

Làm thế nào 1 pixel màu đã giải quyết vấn đề

import os    
import pdfkit
pdfkit.from_file("C:\\Users\\user\Desktop\\table.html", "out.pdf")
os.startfile("out.pdf", "print")
3

Nhập chế độ FullScreenen EXIT Mode FullScreen

Tôi đã đề cập làm thế nào tôi có thể in đúng mã QR mà tôi đã mở đầu tiên trong Word, sau đó sử dụng "Lưu dưới dạng hình ảnh" để tạo ra một hình ảnh PNG mới của nó, bị mờ mạnh vì các vật phẩm nén. Tôi nhận thấy rằng các đồ tạo tác, hơi xám.

Sau đó tôi đã thử một thí nghiệm. Với MS Paint, tôi đã tạo ra một hình ảnh màu trắng rắn. Trên hình ảnh đó, tôi đã vẽ một số vòng tròn màu đen (không Aliased). Tôi đã vẽ một hình ảnh khác, cũng là nền trắng rắn, nhưng với các vòng tròn màu. Sau đó tôi đã thêm cả hai hình ảnh này theo cách thủ công vào tài liệu ODF và in nó. Hình ảnh với các vòng tròn màu đen được in dưới dạng hộp đen, trong khi các vòng tròn màu được in đúng cách. Nội dung chunk hoàn toàn không quan trọng, chỉ có việc sử dụng màu sắc quan trọng.

Hướng dẫn python print html to printer - python in html sang máy in


Kiểm tra vòng tròn màu để xem cách in wordpad phản hồi

Làm cách nào để in một tệp HTML trong Python?

Để hiển thị tệp HTML dưới dạng đầu ra Python, chúng tôi sẽ sử dụng thư viện Codecs.Thư viện này được sử dụng để mở các tệp có mã hóa nhất định.Nó có một mã hóa tham số làm cho nó khác với hàm Open in () tích hợp.using the codecs library. This library is used to open files which have a certain encoding. It takes a parameter encoding which makes it different from the built-in open() function.

Làm cách nào để in máy in HTML?

Bạn có thể dễ dàng thêm nút in vào trang web của mình bằng cách thêm mã sau vào tài liệu HTML của bạn nơi bạn muốn nút xuất hiện:..
onclick = "window.print (); return false;"/>.
print..
loại = "text /css" media = "in" />.
cơ thể {khả năng hiển thị: ẩn;} .print {khả năng hiển thị: hiển thị;}.

Làm cách nào để in vào PDF trong Python?

DLL để thử mã trong môi trường của bạn ...
Tạo đối tượng PDFViewer ..
Mở tệp PDF đầu vào ..
Đặt các thuộc tính để in ..
Tạo các đối tượng cho cài đặt máy in và trang và printDocument ..
Tài liệu in bằng cách sử dụng cài đặt máy in và trang bằng cách gọi printDocumentWithSinstall ..