Artículo técnico

Sellos de página reutilizables a través de objetos XObjects de formulario con PDFium

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. 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 "DRAFT" 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. 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, 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

Por qué un objeto guardado vence a un centenar de redibujados

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, 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. 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; un a en a de la en a y en de a

Capturando una página para convertirla en un XObject

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. CreateXObjectFromPage 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

var
  Dest, Stamp: TPdf;
  XObject: TPdfXObject;
begin
  Dest := TPdf.Create(nil);
  Stamp := TPdf.Create(nil);
  try
    Dest.FileName := 'Report.pdf';
    Dest.Active := True;
    Stamp.FileName := 'Watermark.pdf';   // una página de obra de arte
    Stamp.Active := True;
    if not (Dest.Active and Stamp.Active) then
      raise Exception.Create('No se pudieron abrir los documentos de entrada');

    // Capture la página 0 del documento de sello en un manejador reutilizable que
    // es propiedad de Dest. El origen o fuente debe estar activo; el índice está basado en cero.
    XObject := Dest.CreateXObjectFromPage(Stamp, 0);
    if XObject = nil then
      raise Exception.Create('No se pudo construir el sello XObject');
    // ... colóquelo y, a continuación, libérelo antes de cerrar el Sello (vea a continuación) ...

La de en el la la la en el un o en de de un CreateXObjectFromPage(Source: TPdf; SourcePageIndex: Integer): TPdfXObject. 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 Active, la del al en por de a su del a la un de un nil 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 TPdfXObject 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

Colocar el sello en una página

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 1 PageNumber 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 InsertFormObjectFromXObject. 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 FPDF_PAGEOBJECT, 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 InsertFormObjectFromXObject 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

var
  PageObj: FPDF_PAGEOBJECT;
  M: TPdfMatrix;
  RawM: FS_MATRIX;
begin
  // La página actual de Dest recibe una copia del XObject.
  PageObj := Dest.InsertFormObjectFromXObject(XObject);
  if PageObj = nil then
    raise Exception.Create('Error de inserción en esta página');

  // Posiciónelo: muévase 200 unidades a la derecha, 500 hacia arriba, a un 70 % de escala.
  M := TPdfMatrix.Create;
  try
    M.Scale(0.7, 0.7);
    M.Translate(200, 500);
    RawM := M.Handle;
    if FPDFPageObj_SetMatrix(PageObj, RawM) = 0 then
      raise Exception.Create('No se puede asignar la matriz de sellos');
  finally
    M.Free;
  end;
  Dest.UpdatePage;   // confirme o asigne las ediciones de esta página a su flujo de contenido
  // if not Dest.SaveAs(...) then ... when every page is done.
end;

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; UpdatePage 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 regla del tiempo de vida del manejador que pilla por sorpresa y fastidia al personal

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 CreateXObjectFromPage. 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

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. 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. TPdfXObject 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 matriz y lo que significan sus seis números

La en a y en de a (ISO 32000-1, del de en a de a un en a del a 8.3.4). De la a su un la de a, b, c, d, e, f 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 FS_MATRIX. La la a en por la a en y a el:

// x' = a*x + c*y + e
// y' = b*x + d*y + f
//
// a, d : escala horizontal y vertical
// b, c : los términos de cortante o rotación
// e, f : traslación (donde recala o termina el origen en la página)

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 a, b, c, d 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 TPdfMatrix, un el la en el del a en el un de 32 un el a en y de de por la de FPdfMatrix, 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 Translate, Scale y Rotate 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 Handle 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 FS_MATRIX, 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 FPDFPageObj_SetMatrix; 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 var, el la del de por de de un a su un a la con un y la del un a en a del un 0 un a en a de. La en a FPDFPageObj_Transform, 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

Estampar o poner un sello cada página en el orden correcto

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 PageNumber 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 UpdatePage, la del al en por de a su del a la un de un SaveAs un el la en el del a en el un de 32 un el a en y de de por la de

procedure StampEveryPage(const ASource, AStamp, AOutput: string);
var
  Dest, Stamp: TPdf;
  XObject: TPdfXObject;
  PageObj: FPDF_PAGEOBJECT;
  M: TPdfMatrix;
  RawM: FS_MATRIX;
  I: Integer;
begin
  Dest := TPdf.Create(nil);
  Stamp := TPdf.Create(nil);
  try
    Dest.FileName := ASource;
    Dest.Active := True;
    Stamp.FileName := AStamp;
    Stamp.Active := True;
    if not (Dest.Active and Stamp.Active) then
      raise Exception.Create('No se pudieron abrir los documentos de entrada');

    // 1. Capture la ilustración una vez. El sello está activo aquí.
    XObject := Dest.CreateXObjectFromPage(Stamp, 0);
    if XObject = nil then
      raise Exception.Create('No se pudo capturar la página de sellos');
    try
      // 2. Coloque una copia en cada página de Dest. PageNumber está basado en el índice 1.
      for I := 1 to Dest.PageCount do
      begin
        Dest.PageNumber := I;                // hacer que la página I actualice
        PageObj := Dest.InsertFormObjectFromXObject(XObject);
        if PageObj = nil then
          Continue;

        M := TPdfMatrix.Create;
        try
          M.Rotate(45);                      // marca de agua en diagonal
          M.Translate(150, 100);             // empujar hasta su posición
          RawM := M.Handle;
          FPDFPageObj_SetMatrix(PageObj, RawM);
        finally
          M.Free;
        end;
        Dest.UpdatePage;                     // asigne/confirme las ediciones de esta página
      end;
    finally
      XObject.Free;                          // 3. libere ANTES de que se cierre el Sello
    end;

    // 4. Escriba el resultado mientras Dest está todavía abierto.
    if not Dest.SaveAs(AOutput) then
      raise Exception.Create('No se pudo guardar ' + AOutput);
  finally
    Stamp.Free;                              // origen o fuente se cierra el último
    Dest.Free;
  end;
end;

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 try 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 finally en a su un al el en de a al el de de al a por finally 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 Stamp, 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. 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 Componente PDFium 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