Comment fusionner plusieurs fichiers pdf (générés en temps d'exécution)?
Comment fusionner plusieurs fichiers pdf (générés sur les temps d'exécution) par le biais de ItextSharp
puis de les imprimer.
J'ai trouvé le suivant lien mais cette méthode nécessite la pdf les noms considérant que les fichiers pdf stockés et ce n'est pas mon cas .
J'ai plusieurs rapports, je vais les convertir en pdf files
grâce à cette méthode :
private void AddReportToResponse(LocalReport followsReport)
{
string mimeType;
string encoding;
string extension;
string[] streams = new string[100];
Warning[] warnings = new Warning[100];
byte[] pdfStream = followsReport.Render("PDF", "", out mimeType, out encoding, out extension, out streams, out warnings);
//Response.Clear();
//Response.ContentType = mimeType;
//Response.AddHeader("content-disposition", "attachment; filename=Application." + extension);
//Response.BinaryWrite(pdfStream);
//Response.End();
}
Maintenant, je veux fusionner toutes ces fichiers générés (Bytes
) dans un fichier pdf pour l'imprimer
- Je pense que la question est similaire à ceci: stackoverflow.com/questions/3961804/...
- Les échantillons que vous avez trouvé et les autres commentateurs ont fait de vous, utilisez
PdfReader
pour lire la source des documents.PdfReader
a plusieurs constructeurs, certains prennent une chaîne de nom de fichier en argument, certains tableaux d'octets contenant les PDF; dans votre cas, utilisez les derniers. À partir de la fusion des échantillons, s'il vous plaît ne pas en choisir un en utilisantPdfWriter
mais au lieu d'une seule à l'aide dePdfCopy, PdfSmartCopy, PdfCopyFields,
ouPdfCopyForms
(au choix selon vos besoins). - U de fournir un échantillon pour résoudre le problème s'il vous plaît ?
- Pourquoi U ne recommandons pas
PdfWriter
?? Lorsque j'utilisePdfSmartCopy
au lieu par exemple j'obtiens l'exception suivantedocument has no pages
!! - Lorsque vous utilisez
PdfWriter
à la source de fusion de fichiers Pdf, des fonctions interactives (formulaires et autres annotations) sont perdues. En outre, le fichier PDF résultant en interne contient un inutile wrapper autour de la page d'informations qui, lorsqu'il itéré plusieurs fois peut provoquer des lecteurs de PDF d'échouer lorsque vous essayez d'afficher le fichier PDF. - beaucoup ,mais quand j'utilise
PdfSmartCopy
au lieu par exemple j'obtiens l'exception suivantedocument has no pages
!! - dans le précédent stackoverflow.com/a/3980398/418343 toute recommandation
- Cela peut-il être appliqué à plusieurs .RDL (SSRS) fichier de rapport? Est-ce quelqu'un a essayé?
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez fusionner les documents source à l'aide de la bibliothèque iText(Sharp), il y a deux situations de base:
Vous voulez vraiment fusionner les documents, d'en acquérir les pages dans leur format d'origine, le transfert d'un maximum de leur contenu et de leur interactif annotations que possible. Dans ce cas, vous devez utiliser une solution basée sur un membre de la
Pdf*Copy*
famille des classes.Que vous voulez vraiment intégrer des pages à partir de la source des documents dans un nouveau document, mais que vous voulez le nouveau document de gouverner le format général et ne se soucient pas pour les fonctionnalités interactives (annotations...) dans les documents d'origine (ou même vouloir se débarrasser d'eux). Dans ce cas, vous devez utiliser une solution basée sur le
PdfWriter
classe.Vous pouvez trouver plus de détails en chapitre 6 (en particulier l'article 6.4) de iText dans l'Action — 2e Édition. L'exemple de code Java peut être consulté ici et le C#identifiés versions ici.
Un simple échantillon à l'aide de
PdfCopy
est Concatenate.java /Les concaténer.cs. La pièce centrale de code est:Ici
pdf
peut être défini comme unList<byte[]>
immédiatement contenant les documents sources (approprié pour votre cas d'utilisation de la fusion des intermédiaires en mémoire des documents) ou comme unList<String>
contenant le nom de la source des fichiers de document (approprié si vous fusionnez des documents à partir du disque).Un aperçu à la fin de l'référencé chapitre résume l'utilisation des classes visées:
PdfCopy
: Les Copies des pages d'un ou plusieurs documents PDF existants. Inconvénients majeurs:PdfCopy
ne détecte pas redondant de contenu, et il échoue lors de la concaténation de formes.PdfCopyFields
: Place les champs des différentes formes sur un seul formulaire. Peut être utilisé pour éviter les problèmes rencontrés avec les champs de formulaire lors de la concaténation de formulaires à l'aide dePdfCopy
. L'utilisation de la mémoire peut être un problème.PdfSmartCopy
: Les Copies des pages d'un ou plusieurs documents PDF existants.PdfSmartCopy
est capable de détecter des contenus en double, mais il a besoin de plus de mémoire et de CPU quePdfCopy
.PdfWriter
: Génère des documents PDF à partir de zéro. Peut importer des pages à partir d'autres documents de PDF. L'inconvénient majeur est que toutes les fonctionnalités interactives de l'importation de la page (annotations, signets, les champs, et ainsi de suite) sont perdus dans le processus.PdfCopyFields
choses spécifiques, a trouvé sa place dansPdfCopy
.System.Threading.Interlocked.Increment(page)
. Cela semble indiquer que vous avez accès et de changement quipage
variable à partir de plusieurs threads, et donc la reproduction des classes, trop. Les classes ci-dessus ne sont pas intrinsèquement thread-safe. Donc, vous devez prendre un soin particulier. Donc, merci de décrire votre problème en détail dans une question dans son propre droit.document.Close();
Sans cela, vous pouvez voir les erreurs lors de l'ouverture du fichier pdf fusionné, comme "Il y a une erreur à l'ouverture de ce document. Le fichier est endommagé et n'a pas pu être réparé.". Pour ma part, j'avais besoin de retourner un objet de Flux de données, j'ai donc déclaré cette variable au-dessus de l'Usage:Stream stream = null;
puis vers la fin de mon Usage (immédiatement après l'appel dedocument.Close();
), j'ai ajouté cestream = new MemoryStream(ms.ToArray());
document.Close()
- Non,using (Document document = new Document())
implicitement ferme le document. Si vous avez besoin de saisir la mémoire de diffuser du contenu avant la parenthèse fermante de lausing
, si, vous avez en effet besoin de fermer explicitement.J'ai utilisé iTextsharp avec c# pour combiner des fichiers pdf. C'est le code que j'ai utilisé.
Voici un code que j'ai tirée d'un vieux projet que j'avais. C'était une application web, mais j'ai été en utilisant iTextSharp pour fusionner des fichiers pdf, puis les imprimer.
Je n'ai pas l'écrire, mais fait quelques modifications. Je ne me souviens pas où je l'ai trouvé. Après j'ai fusionné les fichiers Pdf que je voudrais appeler cette méthode pour insérer le javascript pour ouvrir la boîte de dialogue d'impression lorsque le fichier PDF est ouvert. Si vous modifiez bSilent est vraie, alors elle doit imprimer silencieusement à leur valeur par défaut de l'imprimante.
Pas sûr de savoir comment bien le code ci-dessus est écrit depuis que je l'ai tiré de quelque part d'autre et je n'ai pas travaillé en profondeur avec iTextSharp mais je sais qu'il a fait un travail à la fusion de documents Pdf que j'étais la génération au moment de l'exécution.
PdfWriter
à la source de fusion de fichiers Pdf, des fonctions interactives (formulaires et autres annotations) sont perdues. En outre, le fichier PDF résultant en interne contient un inutile wrapper autour de la page d'informations qui, lorsqu'il itéré plusieurs fois peut provoquer des lecteurs de PDF d'échouer lorsque vous essayez d'afficher le fichier PDF.PdfWriter
en effet peut-être plus souvent que ceux qui utilisent le mieux les classes lors de googler autour, et ils ne travail après un de la mode, de sorte qu'ils ne sont pas tout à fait tort.Pdf*Copy*
de solutions à base d', cependant, sont généralement plus faciles à utiliser (pas besoin d'adapter le document cible de taille de page de rotation et encore et encore), plus complète (concernant les fonctionnalités interactives), et de produire plus propre de sortie (par rapport à la structure interne du document PDF).Pour éviter les problèmes de mémoire mentionné, j'ai utilisé des flux de fichier à la place de flux de mémoire(mentionné dans ITextSharp de mémoire exception de la fusion de plusieurs pdf) pour fusionner des fichiers pdf:
Testé avec iTextSharp-LGPL 4.1.6:
PdfWriter
à la source de fusion de fichiers Pdf, des fonctions interactives (formulaires et autres annotations) sont perdues. En outre, le fichier PDF résultant en interne contient un inutile wrapper autour de la page d'informations qui, lorsqu'il itéré plusieurs fois peut provoquer des lecteurs de PDF d'échouer lorsque vous essayez d'afficher le fichier PDF.