Hier ist ein Code, den ich aus einem alten Projekt gezogen habe, das ich hatte. Es war eine Webanwendung, aber ich benutzte iTextSharp, um PDF-Dateien zusammenzuführen und dann zu drucken.
public static class PdfMerger
{
/// <summary>
/// Merge pdf files.
/// </summary>
/// <param name="sourceFiles">PDF files being merged.</param>
/// <returns></returns>
public static byte[] MergeFiles(List<Stream> sourceFiles)
{
Document document = new Document();
MemoryStream output = new MemoryStream();
try
{
// Initialize pdf writer
PdfWriter writer = PdfWriter.GetInstance(document, output);
writer.PageEvent = new PdfPageEvents();
// Open document to write
document.Open();
PdfContentByte content = writer.DirectContent;
// Iterate through all pdf documents
for (int fileCounter = 0; fileCounter < sourceFiles.Count; fileCounter++)
{
// Create pdf reader
PdfReader reader = new PdfReader(sourceFiles[fileCounter]);
int numberOfPages = reader.NumberOfPages;
// Iterate through all pages
for (int currentPageIndex = 1; currentPageIndex <=
numberOfPages; currentPageIndex++)
{
// Determine page size for the current page
document.SetPageSize(
reader.GetPageSizeWithRotation(currentPageIndex));
// Create page
document.NewPage();
PdfImportedPage importedPage =
writer.GetImportedPage(reader, currentPageIndex);
// Determine page orientation
int pageOrientation = reader.GetPageRotation(currentPageIndex);
if ((pageOrientation == 90) || (pageOrientation == 270))
{
content.AddTemplate(importedPage, 0, -1f, 1f, 0, 0,
reader.GetPageSizeWithRotation(currentPageIndex).Height);
}
else
{
content.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0);
}
}
}
}
catch (Exception exception)
{
throw new Exception("There has an unexpected exception" +
" occured during the pdf merging process.", exception);
}
finally
{
document.Close();
}
return output.GetBuffer();
}
}
/// <summary>
/// Implements custom page events.
/// </summary>
internal class PdfPageEvents : IPdfPageEvent
{
#region members
private BaseFont _baseFont = null;
private PdfContentByte _content;
#endregion
#region IPdfPageEvent Members
public void OnOpenDocument(PdfWriter writer, Document document)
{
_baseFont = BaseFont.CreateFont(BaseFont.HELVETICA,
BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
_content = writer.DirectContent;
}
public void OnStartPage(PdfWriter writer, Document document)
{ }
public void OnEndPage(PdfWriter writer, Document document)
{ }
public void OnCloseDocument(PdfWriter writer, Document document)
{ }
public void OnParagraph(PdfWriter writer,
Document document, float paragraphPosition)
{ }
public void OnParagraphEnd(PdfWriter writer,
Document document, float paragraphPosition)
{ }
public void OnChapter(PdfWriter writer, Document document,
float paragraphPosition, Paragraph title)
{ }
public void OnChapterEnd(PdfWriter writer,
Document document, float paragraphPosition)
{ }
public void OnSection(PdfWriter writer, Document document,
float paragraphPosition, int depth, Paragraph title)
{ }
public void OnSectionEnd(PdfWriter writer,
Document document, float paragraphPosition)
{ }
public void OnGenericTag(PdfWriter writer, Document document,
Rectangle rect, string text)
{ }
#endregion
private float GetCenterTextPosition(string text, PdfWriter writer)
{
return writer.PageSize.Width/2 - _baseFont.GetWidthPoint(text, 8)/2;
}
}
Ich habe dies nicht geschrieben, aber einige Änderungen vorgenommen. Ich kann mich nicht erinnern, wo ich es gefunden habe. Nachdem ich die PDFs zusammengeführt hatte, würde ich diese Methode aufrufen, um Javascript einzufügen, um den Druckdialog zu öffnen, wenn die PDF geöffnet wird. Wenn Sie bSilent in "true" ändern, sollte es automatisch auf dem Standarddrucker gedruckt werden.
public Stream addPrintJStoPDF(Stream thePDF)
{
MemoryStream outPutStream = null;
PRStream finalStream = null;
PdfDictionary page = null;
string content = null;
//Open the stream with iTextSharp
var reader = new PdfReader(thePDF);
outPutStream = new MemoryStream(finalStream.GetBytes());
var stamper = new PdfStamper(reader, (MemoryStream)outPutStream);
var jsText = "var res = app.setTimeOut('this.print({bUI: true, bSilent: false, bShrinkToFit: false});', 200);";
//Add the javascript to the PDF
stamper.JavaScript = jsText;
stamper.FormFlattening = true;
stamper.Writer.CloseStream = false;
stamper.Close();
//Set the stream to the beginning
outPutStream.Position = 0;
return outPutStream;
}
nicht sicher, wie gut der obige Code geschrieben ist, da ich es von woanders gezogen und ich habe nicht in der Tiefe überhaupt mit iTextSharp gearbeitet, aber ich weiß, dass es bei Zusammenführen von PDF-Dateien hat Arbeit, die ich zu erzeugen zur Laufzeit.
ich denke Frage zu diesem ähnlich ist: http://stackoverflow.com/questions/3961804/itextsharp-creation-of-a-pdf-from-a-list-of-byte-arrays –
die Proben Sie gefunden und die othe r Kommentatoren, auf die Sie hingewiesen haben, verwenden Sie 'PdfReader', um die Quelldokumente zu lesen. 'PdfReader' hat mehrere Konstruktoren, einige nehmen eine Dateinamenszeichenfolge als Argument, einige Bytearrays enthalten die PDF; Verwenden Sie in Ihrem Fall die letzteren. Aus den gefundenen Zusammenführungs-Samples sollten Sie jedoch keinen mit 'PdfWriter' wählen, sondern mit' PdfCopy, PdfSmartCopy, PdfCopyFields' oder 'PdfCopyForms' (die Auswahl hängt von Ihren genauen Anforderungen ab). – mkl
@mkl: Könnte U bitte ein Beispiel zur Verfügung stellen, um das Problem zu beheben? –