Artigo Técnico

Sobreimpressão CMYK e Dispositivos de Renderização no HotPDF

O HotPDF renderiza uma página PDF carregada através de um único ponto de entrada, RenderLoadedPageToDevice, e o dispositivo que lhe entrega decide se o resultado é um bitmap, um desenho num contexto de dispositivo externo como uma tela de impressora, ou um metafile vetorial melhorado. Defina RenderOverprintPreview como True e a mesma chamada simula sobreimpressão de tintas CMYK de quadricromia, pelo que um operador vê no ecrã a interação de tintas que de outro modo só apareceria na folha de impressão

Estas duas funcionalidades resolvem problemas diferentes que se calham no mesmo caminho de código. A abstração de dispositivo remove o ramo em que antevisão, impressão e exportação tinham cada uma a sua própria chamada de renderização com o seu próprio desvio. A prova de sobreimpressão remove a classe de erro de produção em que um documento parece correto em todos os visualizadores e sai da impressora errado

Porque razão é que uma página imprime de forma diferente da antevisão?

Porque a sobreimpressão é uma instrução ao dispositivo de imagem, não uma operação de pintura. Quando uma página define /OP ou /op como verdadeiro no estado gráfico, está a dizer ao RIP para não eliminar as tintas por baixo — um objeto cyan desenhado sobre amarelo deixa o amarelo no lugar, e a folha mostra verde. Um visualizador que ignore a sobreimpressão elimina normalmente e mostra cyan. Nenhum está errado nos seus próprios termos, e isso é exatamente o problema: o ecrã e a impressora discordam, e ninguém descobre até as provas voltarem

RenderOverprintPreview faz o HotPDF levar a instrução a sério para tintas DeviceCMYK governadas por /OP, /op e /OPM 1. O resultado é uma antevisão de prova em vez de uma antevisão de visualizador: preto a sobreimprimir um tom mantém-se como uma sobreposição rica em vez de abrir um buraco, e uma sobreimpressão acidental de um desenhador em texto branco torna-se visível como o texto a desaparecer que vai ser

var
  Pdf: THotPDF;
  Device: THPDFBitmapRenderDevice;
  Proof: TBitmap;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.LoadFromFile('cover-cmyk.pdf');
    Pdf.RenderOverprintPreview := True;    // proof, not plain preview
    Device := THPDFBitmapRenderDevice.Create;
    try
      if Pdf.RenderLoadedPageToDevice(0, 150, Device) then
      begin
        Proof := Device.TakeBitmap;        // ownership moves to the caller
        try
          Image1.Picture.Assign(Proof);
        finally
          Proof.Free;
        end;
      end;
    finally
      Device.Free;
    end;
  finally
    Pdf.Free;
  end;
end;

A definição participa na identidade da cache de renderização, em memória e em disco, pelo que uma antevisão normal e uma antevisão de prova nunca partilham um bitmap. Alternar a propriedade não exige que invalide nada à mão — uma cache que devolvesse a errada destas duas seria pior do que nenhuma cache de todo

Três dispositivos, uma chamada de renderização

THPDFRenderDevice é uma classe abstrata com dois membros que importam: Kind, que reporta o destino como rdkBitmap, rdkDeviceContext ou rdkEnhancedMetafile, e Execute, que a biblioteca chama. Três dispositivos concretos vêm com o HotPDF, e cada um é dono da sua saída de forma diferente

THPDFBitmapRenderDevice é dono de um TBitmap até TakeBitmap transferir a propriedade para si. THPDFDeviceContextRenderDevice recebe um HDC existente mais largura e altura e desenha diretamente nele, que é como se renderiza para uma tela de impressora sem uma ida e volta de bitmap. THPDFMetafileRenderDevice é dono de um TMetafile até TakeMetafile o transferir, o que mantém o conteúdo vetorial como vetores para os consumidores que o precisam

var
  Device: THPDFDeviceContextRenderDevice;
begin
  Printer.BeginDoc;
  try
    Device := THPDFDeviceContextRenderDevice.Create(
      Printer.Canvas.Handle, Printer.PageWidth, Printer.PageHeight);
    try
      Pdf.RenderLoadedPageToDevice(PageIndex, 300, Device);
    finally
      Device.Free;
    end;
  finally
    Printer.EndDoc;
  end;
end;

Ler Kind em vez de testar a classe em runtime é deliberado. Código de aplicação que despacha por tipo de dispositivo continua a funcionar quando um dispositivo é envolvido, decorado ou substituído, e código que testa is THPDFBitmapRenderDevice não

O que a transferência de propriedade significa na prática

Antes de TakeBitmap ou TakeMetafile, o dispositivo é dono do objeto e liberta-o no seu destruidor. Depois da chamada, o programador é dono dele e o dispositivo já não. Ambos os padrões são legítimos: use a propriedade Bitmap ou Metafile quando o objeto só tem de sobreviver à chamada de renderização, e assuma a propriedade quando o objeto sobrevive ao dispositivo

O modo de falha é o habitual do Delphi. Tire o bitmap, liberta o dispositivo, esqueça-se de libertar o bitmap, e tem uma fuga que cresce com a contagem de páginas — invisível num teste de cinco páginas e óbvia num lote de quinhentas. Envolva ambos os objetos nos seus próprios try/finally em vez de partilhar um, e a questão da propriedade responde-se a si própria

Prova de sobreimpressão e transparência na mesma página

A eliminação por grupo de transparência mantém-se ativa quando a antevisão de sobreimpressão está ligada, e ambos são compostos no mesmo caminho de pintura de instantâneo limitado. Isto importa porque os ficheiros reais prontos para impressão misturam os dois constantemente: um grupo de transparência que contém arte senta-se sobre um fundo cujo preto está definido para sobreimprimir, e simular um sem o outro produz uma prova errada de uma forma nova em vez de certa

Mantenha os limites à vista. A antevisão de sobreimpressão simula o comportamento de tintas de quadricromia para tintas DeviceCMYK sob os controlos de sobreimpressão nomeados acima. É uma prova de interação de tintas, não uma prova contratual com gestão de cor: não substitui um fluxo de trabalho ICC, e não lhe diz o que uma impressora e um suporte específicos vão produzir. Trate-a como um operador de pré-impressão trata uma antevisão de sobreimpressão num visualizador profissional — como a verificação que apanha os erros que ninguém apanha a olhar para uma antevisão normal

Encaixar a prova num passo de preflight

O sítio útil para isto é ao lado das verificações que já corre. Uma passagem de preflight reporta que texto a preto está definido para sobreimprimir; uma renderização de prova mostra a um operador o que isso significa na página; e ambas vão para o mesmo relatório. Para as cores spot, que frequentemente acompanham a sobreimpressão em trabalho de embalagem, o guia de renderização de cores spot Separation e DeviceN cobre o lado dos colorantes da mesma página, enquanto as notas sobre renderizar uma página PDF para um bitmap e sobre imprimir um PDF carregado através de TPrinter cobrem os dois destinos de dispositivo na sua forma simples, sem prova

O HotPDF renderiza, prova e imprime páginas PDF carregadas a partir de código VCL nativo para Delphi e C++Builder, sem qualquer DLL de renderização externa para distribuir ao lado da aplicação — a página do componente HotPDF tem a lista de funcionalidades de renderização e uma compilação de avaliação