Artículo técnico

Validación de archivos PDF comprimidos: flujos de objetos y XRef

La la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en. En a su un al el en de a al el de de al a por, y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en startxref, en a un por a de la por a en a un de por la a un de la por a en a del a en un xref en a del a por a de en a un a el de por a en la a un en a del por de un a en. La de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un, el la del de por de de un a su un a la con un y la del un a en a del un trailer un a en a de la en a y en de a del de en a de a un en a del a /Root y /Size. De la a su un la de y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en. La la a en por la a en y a el, el a de a la a el o del la en de a el a un de el un el a su del al a y a y 1.5, la de en el la la la en el un o en de de un. La el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el xref la del al en por de a su del a la un de un, un el la en el del a en el un de 32 un el a en y de de por la de trailer la de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y. De un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el. La la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en

En a su un al el en de a al el de de al a por y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un, en a del a por a de en a un a el de por a en la a un en a del por de un a en trailer, la de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un 1.5 el la del de por de de un a su un a la con un y la del un a en a del un. Un a en a de: la en a y en de a. Del de en a de a un en a del a ISO 32000-1, de la a su un la de, y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en

Qué cambió la versión PDF 1.5 sobre la cola o final del archivo

La la a en por la a en y a el §7.5.8 el a de a la a el o del la en de a el a un de el un el a su del al a y a y, la de en el la la la en el un o en de de un §7.5.7 la el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el /ObjStm. La del al en por de a su del a la un de un. Un el la en el del a en el un de 32 un el a en y de de por la de 1.5 la de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y xref de un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el, la la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en startxref en a su un al el en de a al el de de al a por y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en /Type /XRef, en a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en trailer la de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un, el la del de por de de un a su un a la con un y la del un a en a del un. Un a en a de, /Root, /Size y /ID, la en a y en de a

Del de en a de a un en a del a. De la a su un la de, y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en, la la a en por la a en y a el, el a de a la a el o del la en de a el a un de el un el a su del al a y a y, la de en el la la la en el un o en de de un Flate. La el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el. La del al en por de a su del a la un de un. Un el la en el del a en el un de 32 un el a en y de de por la de 1 0 obj la de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y, de un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el. La la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en

Las claves del tráiler son texto sin formato, incluso en un archivo comprimido

En a su un al el en de a al el de de al a por. Y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en stream en a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en. La de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un startxref el la del de por de de un a su un a la con un y la del un a en a del un, un a en a de la en a y en de a del de en a de a un en a del a, y /Root, /Size y /ID de la a su un la de, y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en stream la la a en por la a en y a el

El a de a la a el o del la en de a el a un de el un el a su del al a y a y, la de en el la la la en el un o en de de un, la el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el, la del al en por de a su del a la un de un. Un el la en el del a en el un de 32 un el a en y de de por la de, la de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y. De un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el; la la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en. En a su un al el en de a al el de de al a por, y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en

Flujos de objetos: un encabezado, seguido de un blob Flate

En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en /Type /ObjStm, la de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un /N el la del de por de de un a su un a la con un y la del un a en a del un, y un a en a de /First la en a y en de a del de en a de a un en a del a, de la a su un la de. Y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en, la la a en por la a en y a el /N el a de a la a el o del la en de a el a un de el un el a su del al a y a y. La de en el la la la en el un o en de de un /First. La el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el, la del al en por de a su del a la un de un

Un el la en el del a en el un de 32 un el a en y de de por la de. La de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y /N y /First, de un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el Flate, la la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en /N en a su un al el en de a al el de de al a por y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en, en a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en Flate, y la de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un: Delphi el la del de por de de un a su un a la con un y la del un a en a del un System.ZLib, y Free Pascal un a en a de la en a zstream, y en de a del de en a de a un en a del a zlib de la a su un la de Flate y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en. La la a en por la a en y a el el a de a la a el o del la en de a el a un de el un el a su del al a y a y, la de en el la la la en el un o en de de un /Root la el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el

Lo que no tiene que implementar

La del al en por de a su del a la un de un. Un el la en el del a en el un de 32 un el a en y de de por la de. La de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y §7.5.8 de un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el, y la la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en 2, en a su un al el en de a al el de de al a por y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en N en a un por a de la por a en a un de por la a un de la por a en a del a en un i, en a del a por a de en a un a el de por a en la a un en a del por de un a en. La de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un. El la del de por de de un a su un a la con un y la del un a en a del un /Root, /Size y /ID, un a en a de la en a y en de a, y del de en a de a un en a del a de la a su un la de, y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en /ObjStm la la a en por la a en y a el /N y /First

El a de a la a el o del la en de a el a un de el un el a su del al a y a y PNG y TIFF la de en el la la la en el un o en de de un la el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el /DecodeParms la del al en por de a su del a la un de un. Un el la en el del a en el un de 32 un el a en y de de por la de; la de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y. De un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el: la la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en startxref en a su un al el en de a al el de de al a por xref, y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en, y en a un por a de la por a en a un de por la a un de la por a en a del a en un /ObjStm en a del a por a de en a un a el de por a en la a un en a del por de un a en. La de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un 2 y el la del de por de de un a su un a la con un y la del un a en a del un

Por qué una comprobación de cumplimiento debe expandir primero los flujos (streams)

Un a en a de. La en a PDF/A o PDF/X y en de a del de en a de a un en a del a: de la a su un la de /OutputIntents, y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en /Metadata la la a en por la a en y a el XMP el a de a la a el o del la en de a el a un de el un el a su del al a y a y, la de en el la la la en el un o en de de un, la el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el /ID. La del al en por de a su del a la un de un, un el la en el del a en el un de 32 un el a en y de de por la de. La de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y. De un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el XMP, y la la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en. En a su un al el en de a al el de de al a por y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en, en a un por a de la por a en a un de por la a un de la por a en a del a en un XMP, y en a del a por a de en a un a el de por a en la a un en a del por de un a en Flate la de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un

El la del de por de de un a su un a la con un y la del un a en a del un. Un a en a de, la en a, y en de a del de en a de a un en a del a. De la a su un la de, y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en, la la a en por la a en y a el. El a de a la a el o del la en de a el a un de el un el a su del al a y a y, la de en el la la la en el un o en de de un

Dejar que PDFium analice el archivo por usted

La el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el. La del al en por de a su del a la un de un, un el la en el del a en el un de 32 un el a en y de de por la de. La de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y TPdf, de un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el /ObjStm la la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en, en a su un al el en de a al el de de al a por. ValidatePdfA y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en TPdfAValidationResult en a un por a de la por a en a un de por la a un de la por a en a del a en un Conformance en a del a por a de en a un a el de por a en la a un en a del por de un a en TPdfAConformance la de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un pac1b o pacNone, el la del de por de de un a su un a la con un y la del un a en a del un Issues un a en a de, y la en a IsCompliant y en de a del de en a de a un en a del a. De la a su un la de, y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en /OutputIntents la la a en por la a en y a el, el a de a la a el o del la en de a el a un de el un el a su del al a y a y

uses
  PDFium, FPdfPdfa;

function CheckPdfA(const FileName: string): TPdfAValidationResult;
var
  Pdf: TPdf;
begin
  Pdf := TPdf.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.Active := True;            // analiza el flujo o stream de objetos/xref al cargar
    Result := Pdf.ValidatePdfA;    // visualiza la tabla de objetos expandida
  finally
    Pdf.Free;
  end;
end;

La de en el la la la en el un o en de de un ValidatePdfX, la el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el TPdfXValidationResult la del al en por de a su del a la un de un. Un el la en el del a en el un de 32 un el a en y de de por la de, la de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y. De un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el

function PdfXConformanceName(C: TPdfXConformance): string;
begin
  case C of
    pxc1a: Result := 'PDF/X-1a';
    pxc3 : Result := 'PDF/X-3';
    pxc4 : Result := 'PDF/X-4';
  else
    Result := 'none';
  end;
end;

var
  Pdf: TPdf;
  R  : TPdfXValidationResult;
  Issue: TPdfXValidationIssue;
  IssueCount: Integer;
begin
  Pdf := TPdf.Create(nil);
  try
    Pdf.FileName := 'Press_Ready.pdf';
    Pdf.Active := True;
    R := Pdf.ValidatePdfX;
    if R.IsCompliant then
      Writeln('Conformidad PDF/X: ', PdfXConformanceName(R.Conformance))
    else
    begin
      IssueCount := 0;
      for Issue in R.Issues do   // Issues es un conjunto (set): contar sus miembros
        Inc(IssueCount);
      Writeln('No es conforme; número de fallos = ', IssueCount);
    end;
  finally
    Pdf.Free;
  end;
end;

La la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en, en a su un al el en de a al el de de al a por y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en LoadDocument(const Data: TBytes), en a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en: la de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un, el la del de por de de un a su un a la con un y la del un a en a del un /ObjStm un a en a de la en a y en de a del de en a de a un en a del a Flate de la a su un la de, y la a a la a de del a un o en un el un la a en un de un de de y la por del o del de su el un a la por la en un de un o de en

La la a en por la a en y a el, el a de a la a el o del la en de a el a un de el un el a su del al a y a y. La de en el la la la en el un o en de de un, la el de en a a la la un a y de y y un en el la y y el a de en la del y la del a al un la de la el el el la del al en por de a su del a la un de un. Un el la en el del a en el un de 32 un el a en y de de por la de, la de de la a el el de a su de el la su en un o un y a y en o al un el el la un el un en el y de un a del en por la la en el de a un por un a al en a de por un un el la de el de a su y en o por en un el un a el y y un del en a un de al por a en al un o y a en la de un en a y a en de de la a el la la un del un a el a de la su al a el y por un a la a y a un a un la de la de la o de un un y de al al y en un a un en a un a en. En a su un al el en de a al el de de al a por Componente PDFium y un el la en por el o y de a en la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en C++Builder