Заменить конкретный документ в PDF
Включает в себя:
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using Ghostscript.NET.Rasterizer;
Прямо сейчас я использую Ghostscript.Net для объединения нескольких отдельных PDF-файлов в один документ:
/// <summary>
/// Ghostscripts the file specified in parameter 1 as a PDF to the file specified in parameter 2
/// </summary>
/// <param name="fileNames">String[]. Array of Full Paths to a file to convert to a single PDF</param>
/// <param name="outputPath">String. Full Path to where Ghostscript will write the PDF</param>
public static void GhostscriptNetJoin(String[] fileNames, String outputPath)
{
var sb = new StringBuilder();
foreach (var fileName in fileNames)
{
var source = (fileName.IndexOf(' ') == -1) ? fileName : String.Format("\"{0}\"", fileName);
sb.Append(source + " ");
}
var output_file = (outputPath.IndexOf(' ') == -1) ? outputPath : String.Format("\"{0}\"", outputPath);
var gsArgs = new List<String>();
gsArgs.Add("-empty"); // first argument is ignored. REF: http://stackru.com/q/25202577/153923
gsArgs.Add("-dBATCH");
gsArgs.Add("-q");
gsArgs.Add("-dNOPAUSE");
gsArgs.Add("-dNOPROMPT");
gsArgs.Add("-sDEVICE=pdfwrite");
gsArgs.Add("-dPDFSETTINGS=/prepress");
gsArgs.Add(String.Format(@"-sOutputFile={0}", output_file));
gsArgs.Add(sb.ToString());
var version = GhostscriptVersionInfo.GetLastInstalledVersion();
using (var processor = new GhostscriptProcessor(version, false))
{
processor.Process(gsArgs.ToArray());
}
}
Как я мог вернуться позже, чтобы ЗАМЕНИТЬ или ОБНОВИТЬ страницу N?
Я остановил рутину, в которой есть мой план, но в настоящее время я не знаю, как ее выполнить. Могу ли я поставить arg
значения или есть другой инструмент, который я должен использовать?
/// <summary>
/// Replace Specific Document from source PDF file
/// </summary>
/// <param name="source">String. Full path to the multi-page PDF</param>
/// <param name="documentN">String. Full path to the document to insert</param>
/// <param name="indexN">int. Page Index where the new document should be inserted</param>
public static void GhostscriptNetReplace(String source, String documentN, int indexN)
{
var list = new List<String>();
var version = GhostscriptVersionInfo.GetLastInstalledVersion();
using (var processor = new GhostscriptProcessor(version, false))
{
var gsArgs = new List<String>();
// what arguments are needed?
throw new NotImplementedException("I don't know how to code for this yet.");
processor.Process(gsArgs.ToArray());
}
list.RemoveAt(indexN);
list.Insert(indexN, documentN);
var sb = new StringBuilder();
foreach (var fileName in list)
{
var fmtSource = (fileName.IndexOf(' ') == -1) ? fileName : String.Format("\"{0}\"", fileName);
sb.Append(fmtSource + " ");
}
var output_file = (source.IndexOf(' ') == -1) ? source : String.Format("\"{0}\"", source);
using (var processor = new GhostscriptProcessor(version, false))
{
var gsArgs = new List<String>();
gsArgs.Add("-empty"); // first argument is ignored. REF: http://stackru.com/q/25202577/153923
gsArgs.Add("-dBATCH");
gsArgs.Add("-q");
gsArgs.Add("-dNOPAUSE");
gsArgs.Add("-dNOPROMPT");
gsArgs.Add("-sDEVICE=pdfwrite");
gsArgs.Add("-dPDFSETTINGS=/prepress");
gsArgs.Add(String.Format(@"-sOutputFile={0}", output_file));
gsArgs.Add(sb.ToString());
processor.Process(gsArgs.ToArray());
}
}
3 ответа
Я собираюсь добавить ответ на основе того, что я прочитал в посте Баарона здесь:
Преобразование PDF в JPG / изображения без использования специальной библиотеки C#
Я изменил его код и думаю, что он удовлетворит мои потребности. Как и в случае с KenS, опубликованным в комментарии выше, он будет терять качество при каждом запуске.
/// <summary>
/// Replaces document at provided index with new document.
/// Use with Caution! If you continuously cycle using the output as the input,
/// then you run repeated risks of information or quality loss.
/// </summary>
/// <param name="source">String. Full File Path to Source</param>
/// <param name="documentN">String. Full File Path to new document</param>
/// <param name="indexN">int. Index where file needs to go</param>
public static void GhostscriptNetReplace(String source, String documentN, int indexN)
{
var list = new List<String>();
var version = GhostscriptVersionInfo.GetLastInstalledVersion();
var fullPath = Path.GetFullPath(source);
int index = -1;
using (var rasterizer = new Ghostscript.NET.Rasterizer.GhostscriptRasterizer())
{
rasterizer.Open(source, version, false);
for (index = 0; index < rasterizer.PageCount; index++)
{
if (index != indexN)
{
var extracted = Path.Combine(fullPath, String.Format("~1_{0}.jpg", index));
if (File.Exists(extracted))
{
File.Delete(extracted);
}
var img = rasterizer.GetPage(300, 300, index);
img.Save(extracted, ImageFormat.Jpeg);
list.Add(extracted);
} else
{
list.Add(documentN);
}
}
if (index == indexN) // occurs if adding a page to the end
{
list.Add(documentN);
}
}
var output_file = (source.IndexOf(' ') == -1) ? source : String.Format("\"{0}\"", source);
using (var processor = new GhostscriptProcessor(version, false))
{
var gsArgs = new List<String>();
gsArgs.Add("-empty"); // first argument is ignored. REF: https://stackru.com/q/25202577/153923
gsArgs.Add("-dBATCH");
gsArgs.Add("-q");
gsArgs.Add("-dNOPAUSE");
gsArgs.Add("-dNOPROMPT");
gsArgs.Add("-sDEVICE=pdfwrite");
gsArgs.Add("-dPDFSETTINGS=/prepress");
gsArgs.Add(String.Format(@"-sOutputFile={0}", output_file));
foreach (var fileName in list)
{
var source = (fileName.IndexOf(' ') == -1) ? fileName : String.Format("\"{0}\"", fileName);
gsArgs.Add(source);
}
processor.Process(gsArgs.ToArray());
}
foreach (var fileName in list) // delete the temp files
{
File.Delete(fileName);
}
}
Работа решила отложить это сейчас, потому что они не готовы рискнуть потерять качество информации.
Этот код затем выводится как непроверенный.
По идее это должно работать.
Если это поможет, пожалуйста, дайте мне знать. Я ненавижу давать ответы на свои вопросы, если никто не смотрит на это.
Возможно, вы сможете сделать что-то вроде этого (не в состоянии протестировать код прямо сейчас, но принцип этого проверяется на основе репозитория Ghostscript.NET):
var prcPath = "PATH"; //a path to store the temporary files
var pageCount = GetPDFPageCount(source);
var list = SplitPDFatIndex(source, prcPath, indexN);
private static List<String> SplitPDFatIndex(String pathToFile, String tempPath, int index)
{
var outList = new List<String>();
outList.Add(SlicePDFatIndex(pathToFile, tempPath, index, true);
outlist.Add(null); // Alternatively modify method below to permit pulling page N
outList.Add(SlicePDFatIndex(pathToFile, tempPath, index, false);
return outList;
}
private static String SlicePDFatIndex(String pathToFile, String tempPath, int index, bool lessThanIndex)
{
using (var processor = new GhostscriptProcessor(version, false))
{
var pageFrom = 1;
var pageTo = index - 1;
var name = tempPath + "temp_left.pdf";
if (!lessThanIndex)
{
pageFrom = index + 1;
pageTo = pageCount;
name = tempPath + "temp_right.pdf";
}
var gsArgs = new List<String>();
gsArgs.Add("-empty");
gsArgs.Add("-dBATCH");
gsArgs.Add("-q");
gsArgs.Add("-dNOPAUSE");
gsArgs.Add("-dNOPROMPT");
gsArgs.Add("-sDEVICE=pdfwrite");
gsArgs.Add("-dPDFSETTINGS=/prepress");
gsArgs.Add(String.Format(@"-f{0}", pathToFile);
gsArgs.Add("-dFirstPage=" + pageFrom.ToString());
gsArgs.Add("-dLastPage=" + pageTo.ToString());
gsArgs.Add(String.Format(@"-sOutputFile={0}", name));
processor.Process(@"-f{0}", pathToFile);
return name;
}
private static int GetPDFPageCount(String pathToFile)
{
var count;
var GhostscriptViewer viewer;
viewer = new GhostscriptViewer();
viewer.ShowPageAfterOpen = false;
viewer.ProgressiveUpdate = false;
viewer.Open(source); // try (source, version, false) or (source, version, true) if for some reason it hangs up here
count = viewer.LastPageNumber;
viewer.Close()
return count;
}
Из моего связанного поста:
Вы можете использовать PDF Toolkit PDFtk:
Пример:
pdftk A=inA.pdf B=inB.pdf cat A1-12 B3 A14-end output out1.pdf
Выход состоит из первых 12 страниц inA.pdf
затем страница 3 inB.pdf
а затем страниц 14 до конца inA.pdf
,
Многие дистрибутивы Linux предоставляют пакет PDFtk, который вы можете загрузить и установить с помощью менеджера пакетов.