web-dev-qa-db-ja.com

Word doc、docx、およびExcel xls、xlsxをPDF with PHP

PHPを使用してWordおよびExcelファイルをPDFに変換する方法を探しています。

この理由は、さまざまな形式のファイルを1つのドキュメントに結合できるようにする必要があるためです。すべてをPDFに変換できれば、PDFMerger(fpdfを使用)を使用してPDFを1つのファイルにマージできることを知っています。

他の種類のファイル/画像からPDFを作成することはできますが、Word Docsに固執しています。 (HTMLコードからExcelファイルを作成するために既に使用しているPHPExcelライブラリを使用してExcelファイルを変換できる可能性があると思います)。

私はZend Frameworkを使用していませんので、誰かが私を正しい方向に向けることができることを望んでいます。

または、Word文書から画像(jpg)ファイルを作成する方法があれば、それは実行可能です。

助けてくれてありがとう!

30
saulposel

私は自分の問題の解決策を見つけました。リクエストの後、他の人を助けるためにここに投稿します。詳細がわからない場合は申し訳ありませんが、このソリューションに取り組んでからしばらく経ちました。

最初に必要なことは、サーバーにOpenoffice.orgをインストールすることです。ホスティングプロバイダーにOpen Office RPMをVPSにインストールするように依頼しました。これは、WHMから直接実行できます。

サーバーにMS Officeファイルを処理する機能が追加されたので、PHPを介してコマンドライン命令を実行してファイルを変換できます。これを処理するために、PyODConverterを見つけました: https://github.com/mirkonasato/pyodconverter

サーバー上にディレクトリを作成し、PyODConverter pythonファイルをその中に配置しました。また、次のコマンドラインを使用して、Webルートの上にプレーンテキストファイルを作成しました( "adocpdf"という名前)その中の指示:

directory=$1
filename=$2
extension=$3
SERVICE='soffice'
if [ "`ps ax|grep -v grep|grep -c $SERVICE`" -lt 1 ]; then 
unset DISPLAY
/usr/bin/soffice -headless -accept="socket,Host=127.0.0.1,port=8100;urp;" -nofirststartwizard & 
sleep 5s
fi
python /home/website/python/DocumentConverter.py /home/website/$directory$filename$extension /home/website/$directory$filename.pdf

これにより、openoffice.orgライブラリが実行されていることを確認し、PyODConverterスクリプトを呼び出してファイルを処理し、PDFとして出力します。最初の3行の3つの変数は、スクリプトをPHPファイルで実行したときに提供されます。遅延( "sleep 5s")は、openoffice.orgが十分な時間必要に応じて開始します。私は今何ヶ月もこれを使用しており、5秒のギャップは十分な呼吸の余地を与えるようです。

スクリプトは、オリジナルと同じディレクトリにPDFバージョンのドキュメントを作成します。

最後に、PHP内からWord/Excelファイルの変換を開始します(処理しているファイルがWord/Excelドキュメントかどうかをチェックする関数内にあります)...

//use openoffice.org
$output = array();
$return_var = 0;
exec("/opt/adocpdf {$directory} {$filename} {$extension}", $output, $return_var);

このPHP関数は、Word/Excelファイルがサーバーにアップロードされると呼び出されます。exec()呼び出しの3つの変数は、上記のプレーンテキストスクリプトの先頭の3に直接関連します。 。変換用のファイルがWebルート内にある場合、$ directory変数には先行スラッシュを必要としないことに注意してください。

OK、それだけです!うまくいけば、これが誰かに役立ち、私が直面した困難と学習曲線を彼らに救うでしょう。

22
saulposel

トピックWord 2007 docx、Word 97-2004 docpdf、および「変換後yzに変更しますが、実際にはそうなりません」。これまでの経験では、LibreOfficeまたはOpenOfficeを使用した変換は信頼できません。ただし、.docドキュメントは、Word 2007の.docxよりもサポートされる傾向があります。一般的に、.docx.docに変換することは、何も壊さずに非常に困難です。

.docxは、.docがバイナリーではない場合のテンプレート作成にも非常に役立つ傾向があります。

.docからPDFへの変換はほとんどの場合非常に信頼性が高かった。Word文書のデザインやコンテンツにまだ影響を与えることができれば、これは満足できるかもしれないが、私の状況では文書は外国企業から提供されていたため、一部のシナリオでは.docxテンプレートを生成した後でも、生成された.docxをPDFに生成する前に補足テキストでわずかに変更する必要がありました。


WINDOWS BASED!

この問題により、私が見つけた唯一の真の信頼できる変換方法は、 [〜#〜] com [〜#〜] を使用することであるという結論に至りました。 class in PHPそして、MS WordまたはExcelアプリケーションにすべての仕事をさせてください。.docx.docに変換する例のみを示します。 PDF:MS Officeがインストールされていない場合、60日間の trial バージョンをダウンロードできます。これにより、テスト目的に十分なスペースを確保できます。

cOM.net拡張はデフォルトでphp.iniでコメント化されています。行php_com_dotnet.dllを検索し、コメントを外します

  extension=php_com_dotnet.dll

Webサーバーを再起動します(IISは事前ではありません。Apacheも同様に機能します)。

以下のコードは、それがいかに簡単かを示すデモです。

  $Word = new COM("Word.Application") or die ("Could not initialise Object.");
  // set it to 1 to see the MS Word window (the actual opening of the document)
  $Word->Visible = 0;
  // recommend to set to 0, disables alerts like "Do you want MS Word to be the default .. etc"
  $Word->DisplayAlerts = 0;
  // open the Word 2007-2013 document 
  $Word->Documents->Open('yourdocument.docx');
  // save it as Word 2003
  $Word->ActiveDocument->SaveAs('newdocument.doc');
  // convert Word 2007-2013 to PDF
  $Word->ActiveDocument->ExportAsFixedFormat('yourdocument.pdf', 17, false, 0, 0, 0, 0, 7, true, true, 2, true, true, false);
  // quit the Word process
  $Word->Quit(false);
  // clean up
  unset($Word);

これはほんの小さなデモです。変換に関して言えば、これは私が使用でき、推奨できる唯一の本当の信頼できるオプションでした。

16
dbf

1)WAMPを使用しています。

2)Open Officeをインストールしました(Apache http://www.openoffice.org/download/ から)。

3)$output_dir = "C:/wamp/www/projectfolder/";これは、出力ファイルを作成するプロジェクトフォルダーです。

4)入力ファイルを既にここに配置していますC:/wamp/www/projectfolder/wordfile.docx";

次に、コードを実行します。

<?php
    set_time_limit(0);
    function MakePropertyValue($name,$value,$osm){
    $oStruct = $osm->Bridge_GetStruct("com.Sun.star.beans.PropertyValue");
    $oStruct->Name = $name;
    $oStruct->Value = $value;
    return $oStruct;
    }
    function Word2pdf($doc_url, $output_url){

    //Invoke the OpenOffice.org service manager
    $osm = new COM("com.Sun.star.ServiceManager") or die ("Please be sure that OpenOffice.org is installed.\n");
    //Set the application to remain hidden to avoid flashing the document onscreen
    $args = array(MakePropertyValue("Hidden",true,$osm));
    //Launch the desktop
    $oDesktop = $osm->createInstance("com.Sun.star.frame.Desktop");
    //Load the .doc file, and pass in the "Hidden" property from above
    $oWriterDoc = $oDesktop->loadComponentFromURL($doc_url,"_blank", 0, $args);
    //Set up the arguments for the PDF output
    $export_args = array(MakePropertyValue("FilterName","writer_pdf_Export",$osm));
    //print_r($export_args);
    //Write out the PDF
    $oWriterDoc->storeToURL($output_url,$export_args);
    $oWriterDoc->close(true);
    }

    $output_dir = "C:/wamp/www/projectfolder/";
    $doc_file = "C:/wamp/www/projectfolder/wordfile.docx";
    $pdf_file = "outputfile_name.pdf";

    $output_file = $output_dir . $pdf_file;
    $doc_file = "file:///" . $doc_file;
    $output_file = "file:///" . $output_file;
    Word2pdf($doc_file,$output_file);
    ?>
10

ホストのWebサーバーにlibreofficeのポータブルバージョンを正常に配置し、PHPで呼び出して、.docxなどからPDFへのコマンドライン変換をオンザフライで実行します。管理者はいません。私のホストのウェブサーバーに対する権利。

http://geekswithblogs.net/robertphyatt/archive/2011/11/19/converting-.docx-to-pdf-or-.doc-to-pdf-or-.doc.aspx

わーい! PHP LibreOffice(OpenOfficeの後継)を使用して、.docxまたは.odtから.pdfに直接変換します!

8
Robert Hyatt

Open Office/LibreOfficeベースのソリューションは問題ありませんが、PDFがMS-Officeで作成されたソースファイルに似ているとは思わないでください。 PDFオリジナルのように見える90%は、多くのフィールドで受け入れられるとは見なされません。

PDFがオリジナルとまったく同じに見えるようにする唯一の方法は、内部で公式のMS-Office DLLを使用するソリューションを使用することです。非WindowsベースのサーバーでPHPソリューションを実行している場合は、追加のWindowsサーバーが必要です。これは目を引くかもしれません。オプションがない場合があります。

このブログ投稿 をご覧ください。 PHPを使用して、高レベルの忠実度でMS-Officeファイルを変換する方法を示します。

免責事項:私はこのブログ記事を書き、関連する商用製品に取り組んでいました。ただし、これはPHP一緒に仕事をする人にとっては素晴らしい解決策のようです。

4

手順1.システムに「Apache_OpenOffice_4.1.2」をインストールします手順2. githubまたはその他の場所から「unoconv」ライブラリをダウンロードします。

-> C:\ Program Files(x86)\ OpenOffice 4\program\python.exe = Open Officeインストールディレクトリのパス

-> D:\ wamp\www\doc_to_pdf\libobasis4.4-pyuno\unoconv =ライブラリフォルダーのパス

-> D:/ wamp/www/doc_to_pdf/files /'.$ pdf_File_name。 ' = PDFのパスとファイル名

-> D:/ wamp/www/doc_to_pdf/files /'.$ doc_file_name =ドキュメントファイルのパス。

最後の手順よりも作成されていないPDFが->コントロールパネル\すべてのコントロールパネルアイテム\管理ツール->サービス->「wampapache」を検索->右クリックしてプロパティをクリック->ログオンタブをクリックして許可のチェックボックスよりデスクトップと対話するサービス

サンプルの.phpファイルを作成し、以下のコードを配置して、wampまたはxamppサーバーで実行します

$result = exec('"C:\Program Files (x86)\OpenOffice 4\program\python.exe" D:\wamp\www\doc_to_pdf\libobasis4.4-pyuno\unoconv -f pdf -o D:/wamp/www/doc_to_pdf/files/'.$pdf_File_name.' D:/wamp/www/doc_to_pdf/files/'.$doc_file_name);

Windows-8オペレーティングシステムで私のために働いているこのコード

3
Sandip Patel

たくさんのグーグルで解決したことがあります。良い解決策を探すのに疲れている場合は、それを試すこともできます。

一般的な使用SOAP API

SOAP request on https://www.livedocx.com を作成するにはユーザー名とパスワードが必要です

これを使用して登録を行います https://www.livedocx.com/user/account_registration.aspx に応じて手順に従います。

.phpファイルで以下のコードを使用します。

ini_set ('soap.wsdl_cache_enabled', 0);

// you will get this username and pass while register
define ('USERNAME', 'Username'); 
define ('PASSWORD', 'Password');

// SOAP WSDL endpoint
define ('ENDPOINT', 'https://api.livedocx.com/2.1/mailmerge.asmx?wsdl');

// Define timezone
date_default_timezone_set('Europe/Berlin');
$soap = new SoapClient(ENDPOINT);
$soap->LogIn(
    array(
        'username' => USERNAME,
        'password' => PASSWORD
    )
);
$data = file_get_contents('test.doc');
$soap->SetLocalTemplate(
    array(
        'template' => base64_encode($data),
        'format'   => 'doc'
    )
);
$soap->CreateDocument();
$result = $soap->RetrieveDocument(
    array(
        'format' => 'pdf'
    )
);
$data = $result->RetrieveDocumentResult;
file_put_contents('tree.pdf', base64_decode($data));
$soap->LogOut();
unset($soap);

詳細については、このリンクに従ってください http://www.phplivedocx.org/

Ubuntuの場合

OpenOfficeおよびUnoconvのインストールが必要です。

コマンドプロンプトから

apt-get remove --purge unoconv
git clone https://github.com/dagwieers/unoconv
cd unoconv
Sudo make install

ここで、PHPスクリプトに以下のコードを追加し、ファイルが実行可能であることを確認します。

Shell_exec('/usr/bin/unoconv -f pdf  folder/test.docx');
Shell_exec('/usr/bin/unoconv -f pdf  folder/sachin.png');

このソリューションがお役に立てば幸いです。

1
Sunil kumar

http://www.phpdocx.com/ を試しましたか?さらに、サーバー上でもホストできます。

0
Cogicero

PHP固有の場合は、 PHPWord を試すことができます。このライブラリは、純粋なPHPで記述され、さまざまなドキュメントファイル形式で読み書きするためのクラスのセットを提供します(主な欠点は、変換されたファイルの品質がかなり変動する可能性があることです。

あるいは、より高品質のオプションが必要な場合は、 Zamzar のようなファイル変換APIを使用できます。これを使用して、オフィス形式(およびその他)の ワイド をPDFに変換でき、任意のプラットフォーム(Windows、Linux、OS Xなど)から呼び出すことができます。

ファイルを変換するPHPコードは次のようになります。

<?php
$endpoint = "https://api.zamzar.com/v1/jobs";
$apiKey = "API_KEY";
$sourceFilePath = "/my.doc"; // Or docx/xls/xlsx etc
$targetFormat = "pdf";

$postData = array(
  "source_file" => $sourceFile,
  "target_format" => $targetFormat
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $apiKey . ":");
$body = curl_exec($ch);
curl_close($ch);

$response = json_decode($body, true);
print_r($response);
?>

完全開示:私はZamzar APIの主任開発者です。

0
Chris Whyley

これを行う別の方法は、libreofficeコマンドのパラメーターを直接使用することです。

libreoffice --convert-to pdf /path/to/file.{doc,docx}
0
Marcelo A

私の経験でこれを行う最も簡単な方法は、Cloudmersiveの無料のネイティブPHPライブラリで、convertDocumentDocxToPdfを呼び出すだけです:

<?php
require_once(__DIR__ . '/vendor/autoload.php');

// Configure API key authorization: Apikey
$config = Swagger\Client\Configuration::getDefaultConfiguration()->setApiKey('Apikey', 'YOUR_API_KEY');



$apiInstance = new Swagger\Client\Api\ConvertDocumentApi(


    new GuzzleHttp\Client(),
    $config
);
$input_file = "/path/to/file.txt"; // \SplFileObject | Input file to perform the operation on.

try {
    $result = $apiInstance->convertDocumentDocxToPdf($input_file);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ConvertDocumentApi->convertDocumentDocxToPdf: ', $e->getMessage(), PHP_EOL;
}
?>

必ず$ input_fileを適切なファイルパスに置き換えてください。そのようにしたい場合は、バイト配列を使用するように構成することもできます。結果は、変換されたPDFファイルのバイト数になります。

0
A br

Phpを使用してUbuntu/linuxでこれを実行しようとしている人-

Ubuntuには、libre officeがデフォルトでインストールされています。誰でもShellコマンドを使用して、このためにヘッドレスlibreオフィスを使用できます。

Shell_exec('/usr/bin/libreoffice --headless --convert-to pdf:writer_pdf_Export --outdir /var/www/html/demo/public_html/src/var/output /var/www/html/demo/public_html/src/var/source/sample.doc');

私のような他の人に役立つことを願っています。

0
Sandipan S