perl openoffice.org openoffice-writer

perl - Transferencia de estilos de tabla con OpenOffice:: OODoc



openoffice.org openoffice-writer (1)

Hiciste una importación sin procesar. Los documentos para eso dicen "Recuerde también que la importación realmente no se lleva a cabo por OODoc :: File hasta que se guarde y, por lo tanto, los datos importados no están disponibles de inmediato". Sugiero que pruebes $container2->save; y luego volver a cargarlo justo después de importar estilos y luego ver si Table.A1 aparece en doc2.odt''s content.xml después del siguiente guardado:

# load output file my $container2 = odfContainer( $outfile, create => ''text'' ); $container2->raw_import("styles.xml"); # Carry out the import and reload it with the new styles. $container2->save; $container2 = odfContainer( $outfile ); my $doc2 = odfDocument ( container => $container2, part => ''content'' ); # Load table from ''mytest.odt'' my $table=$doc->getTable(0); # Get style from first cell in $table my $headerstyle=$doc->getStyle( $doc->getCell($table, 0, 0) ); # Create table in $doc2 my $newtable=$doc2->appendTable(''newtable'', 1, 1, ''table-style'' => $doc->getStyle($table) ); # Set style of first cell in $newtable to ''Table1.A1'' $doc2->cellStyle( $newtable, 0, 0, ''Table1.A1'' ); # Write ''doc2.odt'' to disk $container2->save;

Estoy intentando copiar el formato de una tabla de un archivo de OpenOffice Writer a otro ... Puedo decir que estoy escribiendo el nombre del estilo en el segundo documento, pero no los datos de estilo.

Sospecho que esto tiene algo que ver con la parte de ''styles'' de odfContainer , pero no tengo claro cómo escribir esto en el segundo documento, especialmente porque cuando inspecciono el objeto $style en el depurador, parece que ser idéntico al objeto $doc , que supuestamente ha cargado la parte ''content'' .

Esto es lo que tengo hasta ahora ...

#! /usr/bin/perl use warnings; use strict; use OpenOffice::OODoc; my $file=''mytest.odt''; my $outfile=''doc2.odt''; # load input file my $container = odfContainer("$file"); $container->raw_export("styles.xml"); my $doc = odfDocument ( container => $container, part => ''content'' ); my $style = odfDocument ( container => $container, part => ''styles'' ); # load output file my $container2 = odfContainer( $outfile, create => ''text'' ); $container2->raw_import("styles.xml"); my $doc2 = odfDocument ( container => $container2, part => ''content'' ); # Load table from ''mytest.odt'' my $table=$doc->getTable(0); # Get style from first cell in $table my $headerstyle=$doc->getStyle( $doc->getCell($table, 0, 0) ); # Create table in $doc2 my $newtable=$doc2->appendTable(''newtable'', 1, 1, ''table-style'' => $doc->getStyle($table) ); # Set style of first cell in $newtable to ''Table1.A1'' $doc2->cellStyle( $newtable, 0, 0, ''Table1.A1'' ); # Write ''doc2.odt'' to disk $container2->save;

La razón por la que estoy cargando ''Table1.A1'' como el estilo de celda es que encontré lo siguiente profundamente dentro de $table , al inspeccionar dentro del depurador:

''next_sibling'' => OpenOffice::OODoc::Element=HASH(0x102029250) ''att'' => HASH(0x102029180) ''style:family'' => ''table-cell'' ''style:name'' => ''Table1.A1'' ''empty'' => 0 ''first_child'' => OpenOffice::OODoc::Element=HASH(0x1020294a0) ''att'' => HASH(0x102029200) ''fo:background-color'' => ''#cccccc'' ''fo:border'' => ''0.0069in solid #000000'' ''fo:padding-bottom'' => ''0in'' ''fo:padding-left'' => ''0.075in'' ''fo:padding-right'' => ''0.075in'' ''fo:padding-top'' => ''0in'' ''style:vertical-align'' => ''top'' ''style:writing-mode'' => ''lr-tb''

Sé que los atributos coinciden con lo que trato de copiar, y también sé por experimentación que el método ''getStyle'' devuelve el atributo style::name ... No sé cómo configurar el style::name atributo que utiliza el método cellStyle para tener realmente los datos subyacentes escritos en el nuevo documento.

Editar:

Al descomprimir el archivo de OpenOffice, obtengo varios archivos xml:

  • settings.xml
  • styles.xml
  • content.xml

etc.

Las partes ''styles'' y ''content'' de OdfContainer corresponden a styles.xml y content.xml. Styles.xml es un poco como un archivo css, que contiene la información de estilo para varios niveles de encabezado de un archivo ODF. Content.xml también contiene información de estilo, al igual que el encabezado css en un documento html.

Aquí está la parte de estilo de content.xml extraída del archivo odt (realmente una muy parecida ... No guardé el original).

<?xml version="1.0" encoding="utf-8"?> <office:document-content> ... <office:automatic-styles> <style:style style:name="Table6" style:family="table" style:master-page-name="First_20_Page"> <style:table-properties style:width="6.9208in" style:page-number="auto" table:align="left" style:writing-mode="lr-tb" /> </style:style> <style:style style:name="Table6.A" style:family="table-column"> <style:table-column-properties style:column-width="1.2729in" /> </style:style> <style:style style:name="Table6.B" style:family="table-column"> <style:table-column-properties style:column-width="3.2604in" /> </style:style> <style:style style:name="Table6.C" style:family="table-column"> <style:table-column-properties style:column-width="2.3875in" /> </style:style> <style:style style:name="Table6.1" style:family="table-row"> <style:table-row-properties style:min-row-height="0.1597in" style:keep-together="true" fo:keep-together="auto" /> </style:style> <style:style style:name="Table6.A1" style:family="table-cell"> <style:table-cell-properties style:vertical-align="bottom" fo:background-color="#cccccc" fo:padding-left="0.075in" fo:padding-right="0.075in" fo:padding-top="0in" fo:padding-bottom="0in" fo:border-left="0.0069in solid #000000" fo:border-right="none" fo:border-top="0.0069in solid #000000" fo:border-bottom="0.0069in solid #000000" style:writing-mode="lr-tb"> <style:background-image /> </style:table-cell-properties> </style:style> ...

  • style: name = "Table6" describe el estilo de la tabla actual,
  • style: name = "Table6.A" describe el estilo de la columna A de esta tabla,
  • style: name = "Table6.A1" describe el estilo de la celda A1

Al hacer una exportación sin procesar de la sección ''content.xml'' del archivo de entrada, una importación sin procesar en el archivo de salida transfiere datos de un archivo a otro.

#! /usr/local/bin/perl use warnings; use strict; use OpenOffice::OODoc; my $infile=$ARGV[0]; my $outfile=''outfile.odt''; my $incontainer = odfContainer( $infile ); $incontainer->raw_export("content.xml"); my $outcontainer = odfContainer( $outfile, create => ''text'' ); $outcontainer->raw_import("content.xml"); $outcontainer->save;

Al ejecutar oodoc.pl infile.odt , al descomprimir outfile.odt e inspeccionar content.xml, se muestra que el estilo se ha transferido correctamente:

<style:style style:name="Table1" style:family="table"> <style:table-properties style:width="6.925in" table:align="margins" /> </style:style> <style:style style:name="Table1.A" style:family="table-column"> <style:table-column-properties style:column-width="2.3083in" style:rel-column-width="21845*" /> </style:style> <style:style style:name="Table1.A1" style:family="table-cell"> <style:table-cell-properties fo:background-color="#cccccc" fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="0.0007in solid #000000" fo:border-bottom="0.0007in solid #000000"> <style:background-image /> </style:table-cell-properties> </style:style>

Ahora que ya se hizo, necesitaré cargar y usar los estilos de celda en $outcontainer .