Artigo Técnico

Prova de Overprint CMYK e Dispositivos de Render no HotPDF

O HotPDF renderiza uma página PDF carregada por um único ponto de entrada, RenderLoadedPageToDevice, e o dispositivo que você entrega decide se o resultado é um bitmap, um desenho em um contexto de dispositivo externo como uma canvas de impressora, ou um enhanced metafile vetorial. Defina RenderOverprintPreview como True e a mesma chamada simula overprint de tintas CMYK de processo, então um operador vê na tela a interação de tintas que de outro modo só apareceria na chapa da impressora

Esses dois recursos resolvem problemas diferentes que por acaso se encontram no mesmo caminho de código. A abstração de dispositivo elimina o ramo em que preview, impressão e exportação tinham cada um sua própria chamada de render com sua própria deriva. A prova de overprint elimina a classe de erro de produção em que um documento parece correto em todos os visualizadores e sai errado da impressora

Por que uma página imprime diferente de como pré-visualiza?

Porque overprint é uma instrução ao dispositivo de imagem, não uma operação de pintura. Quando uma página define /OP ou /op true no estado gráfico, está dizendo ao RIP para não remover as tintas por baixo — um objeto ciano desenhado sobre amarelo deixa o amarelo no lugar, e a chapa mostra verde. Um visualizador que ignora overprint remove normalmente e mostra ciano. Nenhum dos dois está errado em seus próprios termos, e esse é exatamente o problema: a tela e a impressora discordam, e ninguém descobre até as provas voltarem

RenderOverprintPreview faz o HotPDF levar a instrução a sério para pinturas DeviceCMYK governadas por /OP, /op e /OPM 1. O resultado é uma preview de prova em vez de uma preview de visualizador: preto sobreimprimindo uma tintura segue como uma sobreposição rica em vez de abrir um buraco, e o overprint acidental de um designer em texto branco torna-se visível como o texto desaparecido que ele virá a 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 configuração participa da identidade do cache de render, em memória e em disco, então uma preview normal e uma preview de prova nunca compartilham um bitmap. Alternar a propriedade não exige que você invalide nada à mão — um cache que devolvesse a errada entre essas duas seria pior do que nenhum cache

Três dispositivos, uma chamada de render

THPDFRenderDevice é uma classe abstrata com dois membros que importam: Kind, que informa 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 detém sua saída de modo diferente

THPDFBitmapRenderDevice detém um TBitmap até que TakeBitmap transfira a propriedade a você. THPDFDeviceContextRenderDevice recebe uma HDC existente mais largura e altura e desenha direto nela, que é como você renderiza em uma canvas de impressora sem uma ida e volta por bitmap. THPDFMetafileRenderDevice detém um TMetafile até que TakeMetafile o transfira, o que mantém conteúdo vetorial como vetorial para os consumidores que precisam disso

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 faz dispatch sobre o tipo de dispositivo continua funcionando quando um dispositivo é envolvido, decorado ou substituído, e código que testa is THPDFBitmapRenderDevice não continua

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

Antes de TakeBitmap ou TakeMetafile, o dispositivo detém o objeto e o libera em seu destrutor. Depois da chamada, você o detém e o dispositivo não mais. Ambos os padrões são legítimos: use a propriedade Bitmap ou Metafile quando o objeto só precisa sobreviver à chamada de render, e tome a propriedade quando o objeto sobrevive ao dispositivo

O modo de falha é o Delphi comum. Pegue o bitmap, libere o dispositivo, esqueça de liberar o bitmap, e você tem um vazamento que cresce com a contagem de páginas — invisível em um teste de cinco páginas e óbvio em um lote de quinhentas. Envolva ambos os objetos em seu próprio try/finally em vez de compartilhar um, e a questão de propriedade se responde sozinha

Prova de overprint e transparência na mesma página

O knockout de transparency group segue ativo quando a preview de overprint está ligada, e ambos são compostos no mesmo caminho de snapshot de pintura delimitado. Isso importa porque arquivos reais prontos para impressão misturam o tempo todo os dois: um transparency group segurando arte está sobre um fundo cujo preto está configurado para overprint, e simular um sem o outro produz uma prova errada de um jeito novo em vez de certa

Mas mantenha os limites à vista. A preview de overprint simula o comportamento de tinta de processo para pinturas DeviceCMYK sob os controles de overprint nomeados acima. É uma prova de interação de tintas, não uma prova contratual gerida por cores: não substitui um fluxo ICC, e não diz o que uma impressora e um papel específicos vão produzir. Trate como um operador de pré-impressão trata uma preview de overprint em um visualizador profissional — como a verificação que pega os erros que ninguém pega olhando uma preview normal

Encaixando a prova em uma etapa de preflight

O lugar útil para isso é ao lado das verificações que você já roda. Uma passagem de preflight relata que texto preto está configurado para overprint; uma render de prova mostra a um operador o que isso significa na página; e ambas vão para o mesmo relatório. Para spot colors, que frequentemente acompanham overprint em trabalho de embalagens, o guia sobre render de Separation e DeviceN para spot colors cobre o lado dos corantes da mesma página, enquanto as notas sobre renderizar uma página PDF em bitmap e sobre imprimir um PDF carregado por TPrinter cobrem os dois destinos de dispositivo em 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 nenhuma DLL externa de render para implantar ao lado da aplicação — a página do componente HotPDF tem a lista de recursos de render e uma build de avaliação