AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 538938
Accepted
user2233709
user2233709
Asked: 2019-09-05 00:24:31 +0800 CST2019-09-05 00:24:31 +0800 CST 2019-09-05 00:24:31 +0800 CST

Impressão de suporte misto?

  • 772

Preciso gerar e imprimir um documento onde a maioria das páginas são impressas em etiquetas A4 (da bandeja de alimentação manual da impressora) com algumas páginas separadoras impressas em papel A3 comum (de outra bandeja).

Atualmente, estou usando Python e Reportlab e sei como gerar meu documento com tamanho de página misto (A4 para as páginas principais, A3 para as páginas separadoras). Mas quando imprimo com evince, tenho que escolher um tamanho de página para impressão, e todas as páginas são impressas no mesmo tamanho de página e na mesma bandeja…

Existe uma maneira de imprimir meu documento com páginas principais e separadoras em tamanhos de papel diferentes de bandejas diferentes?

pdf printing
  • 1 1 respostas
  • 75 Views

1 respostas

  • Voted
  1. Best Answer
    user2233709
    2019-09-10T05:00:40+08:002019-09-10T05:00:40+08:00

    Graças à ajuda do meuh, pude escrever um pequeno programa Python que converte o PDF que gerei com meu programa existente em um arquivo PostScript, com setpagedevicecomandos específicos do dispositivo.

    Esse programa é bastante específico para meu uso, mas acho que pode ser útil, como ponto de partida, para outros. Aqui está:

    #! /usr/bin/env python3
    
    import argparse
    import re
    import subprocess
    import sys
    
    import PyPDF2
    
    def make_postscript(f):
        """Convert a PDF file to PostScript, with pdf2ps, and yield it line by line."""
        with subprocess.Popen(['pdf2ps', '/dev/stdin', '/dev/stdout'], stdin=f, stdout=subprocess.PIPE, stderr=None) as proc:
            for line in proc.stdout:
                yield line
    
    def add_device_control(postscript, separator_pages):
        """Add device control commands to a PostScript file with DSC comments."""
        DSC_page_re = re.compile(b'%%Page: (?P<page_name>.+) (?P<page_number>[1-9][0-9]*)$')
        DSC_begin_page_setup_re = re.compile(b'%%BeginPageSetup$')
        page_number = None
        for line in postscript:
            m = DSC_page_re.match(line)
            if m:
                assert page_number is None
                page_number = int(m.group('page_number').decode('ASCII'))-1
                yield line
                continue
            m = DSC_begin_page_setup_re.match(line)
            if m:
                assert page_number is not None
                yield line
                if page_number in separator_pages:
                    yield b'mark { << /PageSize [1191 842] /ImagingBBox null /MediaType (Plain) /MediaPosition null >> setpagedevice } stopped cleartomark\n'
                elif page_number not in separator_pages:
                    yield b'mark { << /PageSize [595 842] /ImagingBBox null /MediaType (Labels) /MediaPosition 0 >> setpagedevice } stopped cleartomark\n'
                page_number = None
                continue
            yield line
        assert page_number is None
    
    def walk_outline(outline, depth=0):
        """Walk through the outline of a PDF file in a depth-first search way, and yield each element with its zero-based depth."""
        for obj in outline:
            if isinstance(obj, PyPDF2.pdf.Destination):
                yield depth, obj
            elif isinstance(obj, list):
                for result in walk_outline(obj, depth+1):
                    yield result
            else:
                assert False
    
    def find_separator_pages(f):
        """Find the page number of the separator pages in a PDF file"""
        separator_pages = set()
        reader = PyPDF2.PdfFileReader(f)
        for depth, obj in walk_outline(reader.outlines):
            page_num = reader._getPageNumberByIndirect(obj.page)
            if depth == 0:
                assert page_num >= 0
                separator_pages.add(page_num)
        return separator_pages
    
    def main():
        parser = argparse.ArgumentParser()
        parser.add_argument("input_file", metavar="input.pdf", type=argparse.FileType('rb'))
        parser.add_argument("output_file", metavar="output.ps", nargs="?", type=argparse.FileType('wb'), default=sys.stdout.buffer)
        args = parser.parse_args()
    
        separator_pages = find_separator_pages(args.input_file)
        args.input_file.seek(0)
        postscript = make_postscript(args.input_file)
        postscript = add_device_control(postscript, separator_pages)
        for line in postscript:
            args.output_file.write(line)
    
    if __name__ == "__main__":
        main()
    

    Muito obrigado novamente ao meuh por sua ajuda nos comentários.

    • 0

relate perguntas

  • Mesclar comentários em PDF em um único arquivo

  • Metadados de PDF na coluna do explorador de arquivos

  • Posso alterar como o gedit imprime o cabeçalho da página?

  • exportando man pages para postscript

  • Visualizar PDF como imagem no ranger

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve