Как программно конвертировать файлы Word в PDF?
Я обнаружил несколько программ с открытым исходным кодом / бесплатных программ, которые позволяют преобразовывать файлы.doc в файлы.pdf, но все они представляют собой приложение / драйвер принтера без SDK.
Я обнаружил несколько программ, в которых есть SDK, позволяющий вам конвертировать файлы.doc в файлы.pdf, но все они являются проприетарными, 2000 долларов за лицензию или около того.
Кто-нибудь знает какое-либо чистое, недорогое (желательно бесплатное) программное решение моей проблемы с использованием C# или VB.NET?
Спасибо!
15 ответов
Используйте цикл foreach вместо цикла for - это решило мою проблему.
int j = 0;
foreach (Microsoft.Office.Interop.Word.Page p in pane.Pages)
{
var bits = p.EnhMetaFileBits;
var target = path1 +j.ToString()+ "_image.doc";
try
{
using (var ms = new MemoryStream((byte[])(bits)))
{
var image = System.Drawing.Image.FromStream(ms);
var pngTarget = Path.ChangeExtension(target, "png");
image.Save(pngTarget, System.Drawing.Imaging.ImageFormat.Png);
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
j++;
}
Вот модификация программы, которая работала для меня. Он использует Word 2007 с установленной надстройкой " Сохранить как PDF". Он ищет в каталоге файлы.doc, открывает их в Word, а затем сохраняет их в формате PDF. Обратите внимание, что вам нужно добавить ссылку на Microsoft.Office.Interop.Word в решение.
using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
...
// Create a new Microsoft Word application object
Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
// C# doesn't have optional arguments so we'll need a dummy value
object oMissing = System.Reflection.Missing.Value;
// Get list of Word files in specified directory
DirectoryInfo dirInfo = new DirectoryInfo(@"\\server\folder");
FileInfo[] wordFiles = dirInfo.GetFiles("*.doc");
word.Visible = false;
word.ScreenUpdating = false;
foreach (FileInfo wordFile in wordFiles)
{
// Cast as Object for word Open method
Object filename = (Object)wordFile.FullName;
// Use the dummy value as a placeholder for optional arguments
Document doc = word.Documents.Open(ref filename, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing);
doc.Activate();
object outputFileName = wordFile.FullName.Replace(".doc", ".pdf");
object fileFormat = WdSaveFormat.wdFormatPDF;
// Save document into PDF Format
doc.SaveAs(ref outputFileName,
ref fileFormat, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing);
// Close the Word document, but leave the Word application open.
// doc has to be cast to type _Document so that it will find the
// correct Close method.
object saveChanges = WdSaveOptions.wdDoNotSaveChanges;
((_Document)doc).Close(ref saveChanges, ref oMissing, ref oMissing);
doc = null;
}
// word has to be cast to type _Application so that it will find
// the correct Quit method.
((_Application)word).Quit(ref oMissing, ref oMissing, ref oMissing);
word = null;
Подводя итог для пользователей vb.net, бесплатный вариант (должен быть установлен офис):
Microsoft Office сборки скачать:
- пиа для офиса 2010
Добавить ссылку на Microsoft.Office.Interop.Word.Application
Добавить оператор использования или импорта (vb.net) в Microsoft.Office.Interop.Word.Application
Пример VB.NET:
Dim word As Application = New Application()
Dim doc As Document = word.Documents.Open("c:\document.docx")
doc.Activate()
doc.SaveAs2("c:\document.pdf", WdSaveFormat.wdFormatPDF)
doc.Close()
Просто хотел добавить, что я использовал библиотеки Microsoft.Interop, в частности функцию ExportAsFixedFormat, которую я не видел в этой теме.
using Microsoft.Office.Interop.Word;
using System.Runtime.InteropServices;
using System.IO;
using Microsoft.Office.Core;Application app;
public string CreatePDF(string path, string exportDir)
{
Application app = new Application();
app.DisplayAlerts = WdAlertLevel.wdAlertsNone;
app.Visible = true;
var objPresSet = app.Documents;
var objPres = objPresSet.Open(path, MsoTriState.msoTrue, MsoTriState.msoTrue, MsoTriState.msoFalse);
var baseFileName = Path.GetFileNameWithoutExtension(path);
var pdfFileName = baseFileName + ".pdf";
var pdfPath = Path.Combine(exportDir, pdfFileName);
try
{
objPres.ExportAsFixedFormat(
pdfPath,
WdExportFormat.wdExportFormatPDF,
false,
WdExportOptimizeFor.wdExportOptimizeForPrint,
WdExportRange.wdExportAllDocument
);
}
catch
{
pdfPath = null;
}
finally
{
objPres.Close();
}
return pdfPath;
}
PDFCreator имеет COM-компонент, который вызывается из.NET или VBScript (примеры включены в загрузку).
Но мне кажется, что принтер - это то, что вам нужно - просто смешайте это с автоматизацией Word, и вам будет хорошо.
На дискуссионных форумах Джоэла есть целое обсуждение библиотек для преобразования Word в PDF. Некоторые предложения из ветки:
Я прошел через Word в PDF боль, когда кто-то выкинул мне 10000 файлов Word для конвертации в PDF. Теперь я сделал это в C# и использовал Word Interop, но он был медленным и зависал, если я вообще пытался использовать ПК... очень расстраивает.
Это привело меня к обнаружению, что я могу создавать дампы и их медлительность..... для Excel, которую я использую (EPPLUS), а затем я обнаружил, что вы можете получить бесплатный инструмент под названием Spire, который позволяет конвертировать в PDF... с ограничениями!
Простой код и решение с использованием Microsoft.Office.Interop.Word
конвертировать WORD в PDF
using Word = Microsoft.Office.Interop.Word;
private void convertDOCtoPDF()
{
object misValue = System.Reflection.Missing.Value;
String PATH_APP_PDF = @"c:\..\MY_WORD_DOCUMENT.pdf"
var WORD = new Word.Application();
Word.Document doc = WORD.Documents.Open(@"c:\..\MY_WORD_DOCUMENT.docx");
doc.Activate();
doc.SaveAs2(@PATH_APP_PDF, Word.WdSaveFormat.wdFormatPDF, misValue, misValue, misValue,
misValue, misValue, misValue, misValue, misValue, misValue, misValue);
doc.Close();
WORD.Quit();
releaseObject(doc);
releaseObject(WORD);
}
Добавьте эту процедуру для освобождения памяти:
private void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
//TODO
}
finally
{
GC.Collect();
}
}
Я делаю это как часть процесса выпуска - преобразование Word Doc в PDF.
http://www.suodenjoki.dk/us/productions/articles/word2pdf.htm и http://www.oooforum.org/forum/viewtopic.phtml?t=3772&highlight=pdf+form
не совсем программно, но может вам помочь.
Когда я натолкнулся на некоторые проблемы с автоматизацией офисов на стороне сервера, мы рассмотрели методику, описанную здесь для проекта кода. Он использует переносную версию (которую можно развернуть через xcopy) OpenOffice в сочетании с макросом. Хотя мы еще не сделали этого сами, это выглядит очень многообещающе.
Я был впечатлен Gembox ( http://www.gemboxsoftware.com/), который предоставляет ограниченную бесплатную версию управления документами (включая преобразование PDF). Они также делают библиотеки для электронных таблиц. Лицензия разработчика на 1, если вы превысите их пределы (которые, я думаю, у вас будут), составляет около 580 долларов ( http://www.gemboxsoftware.com/document/pricelist). ОК, это не бесплатно (или, на мой взгляд, относительно недорого), но это намного дешевле, чем 2000 долларов. Насколько я понимаю из их прайс-листа, роялти за развертывание серверов также не взимаются. Возможно, стоит подойти к ним и посмотреть, пойдут ли они на сделку, если вы не хотите делать свои собственные.
Похоже, что некоторая информация здесь:
Преобразование документов MS Word в PDF в ASP.NET
Кроме того, поскольку в Office 2007 имеется функция публикации в PDF, я полагаю, что вы можете использовать автоматизацию делопроизводства, чтобы открыть файл *.DOC в Word 2007 и сохранить как PDF. Я не слишком заинтересован в автоматизации делопроизводства, так как она медленная и склонна к зависанию, но просто выбрасываю это туда...
Я использовал ABCpdf, который является программным вариантом и не слишком дорогим, $300/ лицензия. Он работает либо с OpenOffice, либо возвращается к Word, если OpenOffice недоступен. Настройка была немного хитрой с разрешениями OpenOffice COM, но определенно стоило отдать эту часть приложения на аутсорсинг.
Надстройка Microsoft PDF для word кажется лучшим решением на данный момент, но вы должны принять во внимание, что она не преобразует все документы Word правильно в pdf, а в некоторых случаях вы увидите огромную разницу между словом и выходным pdf. К сожалению, я не смог найти API, который бы правильно конвертировал все текстовые документы. Единственное решение, которое я нашел, чтобы убедиться, что преобразование было на 100% правильным, было преобразование документов через драйвер принтера. Недостатком является то, что документы ставятся в очередь и конвертируются один за другим, но вы можете быть уверены, что полученный PDF точно такой же, как макет документа Word. Я лично предпочел использовать UDC (Универсальный конвертер документов) и установить Foxit Reader(бесплатная версия) на сервере, а затем распечатать документы, запустив "Процесс" и установив для его свойства Verb "печать". Вы также можете использовать FileSystemWatcher, чтобы установить сигнал после завершения преобразования.
Для программистов, которые находятся в ситуации, когда они не могут установить Office на свой сервер или работают в какой-либо облачной среде - недорогой альтернативой другим ответам является Api2Pdf, который поддерживает преобразование файлов Word в PDF, а также любой другой файл MS Office. Это веб-API и использует LibreOffice под капотом.
Я использовал iTextSharp для создания PDF-файлов раньше. Это порт с открытым исходным кодом iText из мира Java, и он довольно мощный.
Я явно не делал преобразование Word в PDF, но я программно создал PDF-файлы и управлял ими.
Вот еще одна ссылка на проект.