Как я могу программно открыть и сохранить презентацию PowerPoint как HTML/JPEG в C# или Perl?

Одна довольно плохая вещь в синглетах - это то, что вы не можете расширить их очень легко. По сути, вам нужно встроить какой-нибудь шаблон декоратора или что-то подобное, если вы хотите изменить их поведение. Кроме того, если в один прекрасный день вы захотите иметь несколько способов сделать это, изменение может оказаться довольно болезненным, в зависимости от того, как вы выложили свой код.

Стоит отметить, что если вы действительно используете синглтоны, попробуйте передать их тому, кто в них нуждается, а не иметь прямой доступ к ним ... В противном случае, если вы когда-нибудь захотите иметь несколько способов сделать то, что делает синглтон, это будет довольно сложно изменить, поскольку каждый класс встраивает зависимость, если он напрямую обращается к синглтону.

Таким образом, в основном:

public MyConstructor(Singleton singleton) {
    this.singleton = singleton;
}

, а не:

public MyConstructor() {
    this.singleton = Singleton.getInstance();
}

Я считаю, что этот тип паттерна называется внедрение зависимости и обычно считается хорошей вещью .

Как и любой шаблон, хотя ... Подумайте об этом и подумайте, является ли его использование в данной ситуации неуместным или нет ... Правила обычно нарушаются, и шаблоны не должны применяться произвольно без мыслей.

8
задан Sinan Ünür 24 June 2009 в 02:22
поделиться

2 ответа

Следующее откроет C: \ presentation1.ppt и сохранит слайды как C: \ Presentation1 \ slide1.jpg и т. Д.

Если вам нужно получить сборку взаимодействия, она доступна в разделе «Инструменты» программы установки Office или ее можно загрузить с здесь (офис 2003) . Оттуда вы сможете найти ссылки на другие версии, если у вас более новая версия офиса.

using Microsoft.Office.Core;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;

namespace PPInterop
{
  class Program
  {
    static void Main(string[] args)
    {
        var app = new PowerPoint.Application();

        var pres = app.Presentations;

        var file = pres.Open(@"C:\Presentation1.ppt", MsoTriState.msoTrue, MsoTriState.msoTrue, MsoTriState.msoFalse);

        file.SaveCopyAs(@"C:\presentation1.jpg", Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsJPG, MsoTriState.msoTrue);
    }
  }
}

Изменить: Версия Синана с использованием экспорта выглядит немного лучше, поскольку вы можете указать вывод разрешающая способность. Для C # измените последнюю строку выше на:

file.Export(@"C:\presentation1.jpg", "JPG", 1024, 768);
26
ответ дан 3 November 2019 в 13:10
поделиться

Как указывает Кев , не используйте это на веб-сервере. Однако следующий сценарий Perl отлично подходит для преобразования файлов в автономном режиме и т. Д .:

#!/usr/bin/perl

use strict;
use warnings;

use Win32::OLE;
use Win32::OLE::Const 'Microsoft PowerPoint';
$Win32::OLE::Warn = 3;

use File::Basename;
use File::Spec::Functions qw( catfile );

my $EXPORT_DIR = catfile $ENV{TEMP}, 'ppt';

my ($ppt) = @ARGV;
defined $ppt or do {
    my $progname = fileparse $0;
    warn "Usage: $progname output_filename\n";
    exit 1;
};

my $app = get_powerpoint();
$app->{Visible} = 1;

my $presentation = $app->Presentations->Open($ppt);
die "Could not open '$ppt'\n" unless $presentation;

$presentation->Export(
    catfile( $EXPORT_DIR, basename $ppt ),
    'JPG',
    1024,
    768,
);

sub get_powerpoint {
    my $app;
    eval { $app = Win32::OLE->GetActiveObject('PowerPoint.Application') };
    die "$@\n" if $@;

    unless(defined $app) {
        $app = Win32::OLE->new('PowerPoint.Application',
            sub { $_[0]->Quit }
        ) or die sprintf(
            "Cannot start PowerPoint: '%s'\n", Win32::OLE->LastError
        );
    }
    return $app;
}
7
ответ дан 3 November 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: