C# 翻到最后 { 列表。添加(文档n); } } 变量输出文件=(source.IndexOf(“”)=-1)?source:String.Format(“{0}\”,source); 使用(var处理器=新的GhostscriptProcessor(版本,false)) { var gsArgs=新列表(); gsArgs.Add(“-empty”);//忽略第一个参数。REF:https://stackoverflow.com/q/25202577/153923 gsArgs.Add(“-dBATCH”); gsArgs.添加(“-q”); gsArgs.Add(“-dNOPAUSE”); gsArgs.Add(“-dNOPROMPT”); gsArgs.Add(“-sDEVICE=pdfwrite”); gsArgs.Add(“-dPDFSETTINGS=/prepress”); 添加(String.Format(@“-sOutputFile={0}”,输出文件)); foreach(列表中的var文件名) { var source=(fileName.IndexOf(“”)=-1)?fileName:String.Format(“{0}\”,fileName); gsArgs.Add(来源); } Process(gsArgs.ToArray()); } foreach(列表中的var fileName)//删除临时文件 { 删除(文件名); } }

C# 翻到最后 { 列表。添加(文档n); } } 变量输出文件=(source.IndexOf(“”)=-1)?source:String.Format(“{0}\”,source); 使用(var处理器=新的GhostscriptProcessor(版本,false)) { var gsArgs=新列表(); gsArgs.Add(“-empty”);//忽略第一个参数。REF:https://stackoverflow.com/q/25202577/153923 gsArgs.Add(“-dBATCH”); gsArgs.添加(“-q”); gsArgs.Add(“-dNOPAUSE”); gsArgs.Add(“-dNOPROMPT”); gsArgs.Add(“-sDEVICE=pdfwrite”); gsArgs.Add(“-dPDFSETTINGS=/prepress”); 添加(String.Format(@“-sOutputFile={0}”,输出文件)); foreach(列表中的var文件名) { var source=(fileName.IndexOf(“”)=-1)?fileName:String.Format(“{0}\”,fileName); gsArgs.Add(来源); } Process(gsArgs.ToArray()); } foreach(列表中的var fileName)//删除临时文件 { 删除(文件名); } },c#,ghostscript,ghostscript.net,C#,Ghostscript,Ghostscript.net,工作组已经决定暂时推迟,因为他们还没有准备好冒失去信息质量的风险 那么,这段代码就作为未经测试的代码发布了 从理论上讲,这应该是可行的 如果有帮助,请告诉我。如果没有人看我自己的问题,我就不愿意继续回答。我将根据我在baaron的帖子中读到的内容添加一个答案: 我修改了他的代码,我想它会满足我的需要。不过,就像KenS在上面的评论中所说的那样,每次运行时,它的质量都会继续下降 /// <summary> /// Replaces document at provided index

工作组已经决定暂时推迟,因为他们还没有准备好冒失去信息质量的风险

那么,这段代码就作为未经测试的代码发布了

从理论上讲,这应该是可行的


如果有帮助,请告诉我。如果没有人看我自己的问题,我就不愿意继续回答。

我将根据我在baaron的帖子中读到的内容添加一个答案:

我修改了他的代码,我想它会满足我的需要。不过,就像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://stackoverflow.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);
    }
}
//
///用新文档替换提供索引处的文档。
///小心使用!如果连续循环使用输出作为输入,
///然后,您将面临信息或质量损失的重复风险。
/// 
///绳子。源的完整文件路径
///绳子。新文档的完整文件路径
///int.文件需要放在哪里的索引
公共静态void GhostscriptNetReplace(字符串源、字符串文档n、int索引n)
{
var list=新列表();
var version=GhostscriptVersionInfo.GetLastInstalledVersion();
var fullPath=Path.GetFullPath(源);
int指数=-1;
使用(var rasterizer=new Ghostscript.NET.rasterizer.GhostscriptRasterizer())
{
光栅化器。开放(源代码,版本,错误);
对于(索引=0;索引
工作组已经决定暂时推迟,因为他们还没有准备好冒失去信息质量的风险

那么,这段代码就作为未经测试的代码发布了

从理论上讲,这应该是可行的

如果有帮助,请告诉我。如果没有人看我自己的问题,我就不想继续回答它。

我的:

您可以使用PDF工具包:

例如:

pdftk A=inA.pdf B=inB.pdf cat A1-12 B3 A14-end output out1.pdf
输出包括
inA.pdf
的前12页,然后是
inB.pdf
的第3页,然后是第14页,直到
inA.pdf
的结尾

许多Linux发行版提供了一个PDFtk软件包,您可以使用其软件包管理器下载和安装。

我的:

您可以使用PDF工具包:

例如:

pdftk A=inA.pdf B=inB.pdf cat A1-12 B3 A14-end output out1.pdf
输出包括
inA.pdf
的前12页,然后是
inB.pdf
的第3页,然后是第14页,直到
inA.pdf
的结尾


许多Linux发行版都提供了PDFtk软件包,您可以使用其软件包管理器下载和安装。

这显然是针对Windows的。似乎没有详细说明如何从PDF中提取文件…或者如果使用Ghostscript也可以。问题的简单答案是,你不能,至少不使用Ghostscript。在使用pdfwrite设备时,您需要时刻牢记的一点是,它不会以任何方式修改PDF文件。它所做的是根据输入创建全新的PDF文件。如果您持续循环使用输出作为输入,那么您将面临信息或质量损失的重复风险。还有,我们有没有办法建立一个Ghostscript.NET论坛?这些不是真正的鬼脚本questions@KenS:做不到?胡扯。感谢您提供的信息。我的意思是“不能通过更改PDF文件来完成”,有很多方法可以通过Ghostscript实现您想要的,但所有这些方法都涉及多次转换,这可能是不好的(而且速度很慢)。您可以使用%d语法将原始PDF“突发”为N个单页PDF,然后将它们全部提供给
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;
}
/// <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://stackoverflow.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);
    }
}
pdftk A=inA.pdf B=inB.pdf cat A1-12 B3 A14-end output out1.pdf