8
votes

.NET Bibliothèque de documents de composition (PDF ou similaire)?

EDIT: meilleure explication: Avant de définir une prime pour cette question, je souhaite énoncer plus de choses ce dont j'ai besoin:

J'ai besoin de la bibliothèque .NET pour générer des documents imprimables. Les utilisateurs doivent pouvoir imprimer exactement le même document qu'elles voient à l'aide de mon application ou à l'aide de l'outil externe (comme Adobe Acrobat Reader). Il ne doit pas nécessairement être bibliothèque pour générer des documents PDF, tout format de document qui satisfait au-dessus de la condition.

J'ai besoin de la bibliothèque pour prendre en charge les scénarios suivants:

scénario 1:

  1. Je crée du texte dans certaines polices et couleur.
  2. Je demande à la bibliothèque de la largeur si ce texte si imprimé.
  3. i Calculement de position ([x, y] coordonnées à la page) de ce texte en fonction des informations de 2. et avez-vous la bibliothèque à imprimer à cette position sur une page.

    scénario 2:

    1. Je crée un texte avec certaines parties de celui-ci en superscript. Toutes les parties du texte (normal et superscript) sont dans la même police (mais variable).
    2. Je demande à la bibliothèque quelle est la largeur si ce texte est imprimé. Je reçois une réponse correcte qui prend également Kenting entre le texte normal et le Superscript en compte.
    3. i Compute la position ([x, y] coordonnées) sur une page où ce texte doit être imprimé (à l'aide de sa largeur à partir de l'étape 2.). Je laisse la bibliothèque à l'imprimer à cette position. Imprimé sur la page Il a exactement la largeur qui a été renvoyée par la bibliothèque à l'étape précédente.

      Remarque pour le deuxième scénario: J'ai du texte avec certaines pièces dans Superscript - Exemple AAA {V-Superscript Texte} BBB (où le texte dans {} < / Code> Bretelles est Superscript). La bibliothèque doit être capable d'imprimer ce texte en utilisant Correction Kenting . Sans le désir de droite, il y aura le même écart entre le dernier A et le premier Superscript V comme entre le dernier Superscript t et premier b . Pour l'utilisateur, il ressemblera à un espace entre A et superscript v mais aucun espace après la dernière lettre Superscript. Donc, le texte sera laid. Si la bibliothèque doit gérer cela correctement, la méthode permettrait d'imprimer le texte intégral AAA {V-Superscript Text} BBB à la fois avec des spécifications qu'une partie de celle-ci est en superscript. Ensuite, cela utiliserait la corrontation correcte entre le texte normal et la superscript.

      scénario 3:

      1. Je veux imprimer une image composée de lignes, de cercles, de cercles remplis, de lettres et de courbes de Bézier sur un point exact d'une page. J'ai besoin de spécifier la largeur des lignes et des cercles. Toutes les formes doivent être imprimées en précision de pixels.

        La bibliothèque doit être gratuite et non GPL (LGPL est OK). Y a-t-il quelque chose qui me permet de faire ce dont j'ai besoin? Peut-il être fait avec ItextShaarp (version 4.1.6 qui est LGPL non AGPL)? Ou peut-être avec un document fixe? Merci pour toutes suggestions.


        Question originale:

        J'ai besoin de documents complexes de composition dans l'application .NET (C #) pour l'utilisateur. L'utilisation principale de ces documents sera destinée à l'impression.

        Les documents contiendront du texte et des graphiques générés simples. La disposition du texte et du graphique sera complexe et doit être calculée (dans une autre manière la position du texte dans le document doit être contrôlée par mon code, elle ne sera pas effectuée automatiquement par la bibliothèque choisie).

        Voici mes exigences de l'API:

        1. fonction qui renvoie la largeur exacte pour la chaîne donnée et la police donnée dans laquelle le texte doit apparaître
        2. Possibilité de positionner le texte à la position exacte sur la page
        3. avoir du texte avec une partie de celui-ci dans Super Script
        4. fonction pour obtenir une largeur exacte d'un texte qui en a une partie dans Superscript
        5. possibilité d'ajouter des images ou même une meilleure option pour dessiner des graphiques simples (ligne d'épaisseur donnée, cercle rempli de rayon / diamètre donné)

          Il n'est pas nécessaire d'être bibliothèque pour la création de documents PDF - tout autre "ce que vous voyez est ce qui sera imprimé" le format de document fera également le format de document. S'il y a un composant WPF pouvant afficher de tels documents, c'est un avantage. Je sais qu'il y a iTextShaRP mais n'est pas facile à atteindre 4. Exigence avec iTextShaRP. Certaines bibliothèques de génération PDF satisfaisant aux exigences ci-dessus seront également une excellente solution.

          Merci pour toute suggestion, je suis également heureux de fournir des détails ou une explication plus claire.


7 commentaires

Avez-vous regardé xps / xpsdocumentwriter / etc. encore?


@Logan Capaldo: Ce nom me semble familier ... S'il s'agit de ce format qui a un contrôle de WPF natif pour l'afficher que je l'ai vu il y a quelque temps. Mais je n'ai pas compris que s'il existe un moyen simple de générer de tels documents dans WPF. J'ai des questions sans réponses à ce sujet ici: Stackoverflow.com / Questions / 4634445 / How-To-Work-with-fixpa ge .


@Logan Capaldo: Mais le document XPS n'est pas corrigé? Donc, il n'affiche pas exactement la même mise en page que sera imprimée?


@drasto: Wikipedia dit "Comme le format PDF de Adobe Systems, XPS est un format de document de mise en page fixe conçu pour préserver la fidélité du document, fournissant une apparence de document indépendante de l'appareil." Semble comme ce que vous avez demandé.


@Martinho Fernandes: Oui, on ressemble à ça. Je ne sais tout simplement pas s'il propose également des API pour créer des documents qui me permettent de faire toutes les réflexions décrites dans ma question ...


J'ai fait du gogling et il semble qu'il n'y ait pas de tutoriel ni de ressource sur la manière de générer des documents. Il y a des réponses sur de sorte que montre comment créer des documents XPS à partir de certains fixePage s mais je ne sais toujours pas comment créer fixepage avec du contenu de .NET. Ma question Stackoverflow.com/questions/4634445/how-to -La-à-point-with-fixpa ge est toujours sans réponse.


Modification de ma réponse à nouveau.


7 Réponses :


0
votes
  1. latex: latex pour génération PDF en production
  2. pour les bibliothèques de rémunération comme aspostées: http://www.aspose.com/categories/.net-components/aspose.pdf-for-.net/default.aspx
  3. HTML uni avec de bonnes CSS peut trop bien fonctionner.
  4. Microsoft Open XML: http://msdn.microsoft.com/fr -Us / Bibliothèque / BB448854.ASPX

    Pour ce que ça vaut la peine, je pense que itexthaparpe est le plus facile des tas. Vous pouvez faire ce que vous voulez dans tous, mais ils ont chacun des avantages et des inconvénients.


5 commentaires

Latex: J'ai besoin d'un accès programmatique à la largeur des chaînes qui figureront dans mon document pour calculer la mise en page. Cela ne peut pas être fait avec du latex. HTML: Où est-ce que je reçois la largeur des chaînes? Ouvrez XML - voir les commentaires précédents à la question originale.


Je suis loin d'un expert en latex, mais je suis sûr que vous pouvez faire tout ce que vous voulez. Vous pouvez spécifier la largeur d'un nœud comme décrit ici: tex.stackexchange.com/questions/7660/... HTML: polices de contrôle avec CSS et calculer la largeur des chaînes basées sur la longueur et Informations de la police. Ouvrir XML: Le SDK que j'ai lié est très riche, je suis sûr que vous pouvez faire ce dont vous avez besoin. Comme je l'ai dit, vous pouvez faire ce dont vous avez besoin avec toutes les bibliothèques, cela peut nécessiter une créativité et un travail acharné. Je ne pense pas qu'il y ait un moyen facile de sortir ici.


Je sais très bien ce qui peut être fait en latex et ce qui ne peut pas être fait. Vous pouvez utiliser une largeur d'informations de certaines chaînes dans le latex lui-même, mais vous ne pouvez pas y accéder à l'extérieur du code .NET. Je ne peux pas laisser la latex à faire la mise en page seule sans .net parce que ma mise en page est trop complexe pour le latex - j'ai besoin d'une langue de programmation complète pour la calculer. Et non, vous ne pouvez rien faire de votre choix en latex. C'est ce que vous ne pouvez pas faire: Stackoverflow.com/questions/2599644/... . Et c'est la raison pour laquelle je ne peux pas l'utiliser.


Je ne comprends toujours pas comment obtenir la largeur des chaînes dans HTML ... sur la base de quelles informations de police? Si j'utilise des informations de la police .NET, la largeur ne sera jamais la même que celle montrée dans HTML. Je ne suis pas sûr à 100% mais je parierais qu'il y a différents kingning au moins ... et HTML n'est pas une bonne solution pour les documents générés par programmation et pour l'impression de toute façon.


Comme dans, vous pouvez mesurer la taille de la taille de la police: 12PX Courrier Nouveau "Hello World" String est puis base à vos calculs à ce sujet. Quoi qu'il en soit, j'ai donné plusieurs autres options. J'espère qu'ils ont aidé.



1
votes

Voici un article sur la construction d'objets fixaDocument sur MSDN. < / p>

Si vous utilisez WPF, vous souhaitez créer des documents de qualité d'impression, les technologies fixesDocument et XPS intégrées sont probablement ce que vous devriez apprendre. Et puisque vous pouvez éventuellement accéder à l'ensemble de l'article fixe dans le modèle d'objet, il peut également vous indiquer vos numéros de largeur. Je n'ai pas encore expérimenté cela.


1 commentaires

Eh bien avant de décider de l'utiliser, j'ai besoin de savoir qu'il est possible de faire ce que je dois faire avec ça. J'ai donc besoin de savoir comment obtenir des informations sur la largeur de texte et comment est-il possible de composer le super script. Et comment est-il possible de mesurer le texte de super script.



1
votes

Notre produit, PDFone .NET peut répondre à vos besoins. Il est livré avec une licence commerciale libre de droits.

  1. fonction qui renvoie la largeur exacte pour la chaîne donnée et la police donnée dans laquelle le texte doit apparaître
    Vous pouvez utiliser la méthode pdffont.getextWidth () pour cela.
  2. possibilité de positionner le texte à la position exacte sur la page
    Vous pouvez utiliser l'une des nombreuses surcharges PDFDocument.WriteTetText () pour cette
  3. avez du texte avec une partie de celui-ci dans Super Script
    PDF n'a pas ce concept dans ses textos. Ce qui nous apparaît comme une superstring est juste une autre chaîne avec une taille et une position de police différentes. Vous devez juste appeler un autre texte pour cela.
  4. fonction pour obtenir une largeur exacte d'un texte qui en a une partie dans Superscript
    Reportez-vous à la réponse précédente.
  5. la possibilité d'ajouter des images ou même une meilleure option pour dessiner des graphiques simples (ligne d'épaisseur donnée, cercle rempli de rayon / diamètre donné) - Pdfone .NET a rendu des images, des carrés, des rectangles, des arcs, Courbes de bezeir, ellipses, cercles, rectangles, polylines, polygones, rectangles, filigranes, timbres, plusieurs types d'annotations, ...

    PDFone .NET est également livré avec un composant PDF Imprimante et un composant Viewer PDF.

    Disclaimer: Je travaille pour Gnostice.


2 commentaires

+1 bonne réponse. Cependant, lorsque vous écrivez 3. Que ce qui apparaît comme Superscript, c'est juste un autre texte dans une autre position, je pense que ce n'est pas ce que je désire. Si je n'aijoune que du texte plus petit décalé comme Superscript, il semblera laids car il n'y aura pas de kernage entre le texte normal et le Superscript. Considérant exemple A ^ v Il y aura beaucoup d'espace entre A et Superscript v . Dans un autre cas e ^ b Il y aura beaucoup moins d'espace alors dans le cas précédent. Donc, je n'ai pas besoin de positionner correctement Superscript sans information de fondre. Et puis j'ai aussi besoin d'informations pour le mesurer.


Je dois me corriger concernant les textouts Superscript et Indibat. J'ai référé cette question à nos développeurs (post-réponse) et ils disent que PDF ne nécessite pas de textouts séparés, c'est-à-dire qu'il peut atteindre un seul texte. Nous ajouterons un soutien à de telles chaînes dans les versions à venir. Actuellement, nos produits nécessiteraient des textes séparés.



4
votes

Vous pouvez regarder bibliothèque docotic.pdf (Disclaimer: Je travaille pour miracle). Il possède une API conviviale et un bon ensemble d'échantillons que vous pouvez visualiser en ligne ou exécuter une application Sample Viewer.

En outre, il satisfait à vos besoins:


2 commentaires

Y a-t-il un endroit où je peux voir la sortie de cet exemple pour Superscript que vous avez fourni: bitmiracle.com/pdf-library/help/text-rise.aspx ? Avez-vous une version d'essai / démo / gpl gratuite ou quelque chose que je peux essayer avant de payer?


Bien sûr. Vous pouvez télécharger et évaluer la docotic . Il est livré avec un sample Viewer et un ensemble d'échantillons pour Visual Studio 2005-2010. La version d'évaluation a des limitations, vous pouvez lire des détails ici



2
votes

Plutôt que de chercher d'autres bibliothèques, que diriez-vous de rechercher un meilleur moyen de calculer la largeur du texte de taille / style mixte?

ColumnText colTx = new ColumnText(contByte);
// paragraphs are phrases.
colTx.addText(phraseWithSuperAndSubScriptStuff);
colTx.setSimpleColumn(llx, lly, urx, ury);
colTx.go();


6 commentaires

@Mark Storer: Mon problème avec ItextShaparpe est que lorsque vous souhaitez avoir du texte en Superscript qui suit après texte qui n'est pas en superscript. ITEXTSTHARP fait de la bonne fusion lorsque vous l'utilisez de manière standard. Mais lorsque vous souhaitez également positionner ce texte qui inclut Superscript sur la page, vous devez utiliser pdfcontentbyte . Lorsque vous l'utilisez, je n'ai pas trouvé le moyen d'imprimer un texte complexe qui inclut Superscript à la fois. Je pense que cela ne permet d'imprimer que d'imprimer un morceau de texte dans l'heure. Je ne peux pas mesurer le texte avec SuperScript Prise en compte et ensuite la mettre sur la position de la page ...


... sans le diviser en morceaux et imprimer des morceaux séparés sur la page. Mais cette façon je lâche la fouton entre ces morceaux (à la frontière entre le texte Superscript et non-Superscript). Et donc le résultat est le texte, soit mauvais (sans kernage avant Superscript), mais je peux le mesurer et imprimer sur une position spécifiée - ou cela semble bon et je peux le mesurer, mais je ne peux pas l'imprimer en position personnalisée sur la page ( Je ne peux pas utiliser columtext avec pdfcontentbyte ). Je peux télécharger la dernière version d'ItextShaarp qui n'est pas un problème. Maintenant, j'utilise la version qui ressemble à 1 an.


@Mark Storer, ce n'est que maintenant que j'ai mentionné que vous avez édité votre réponse. Vous avez compris mes commentaires correctement. Il y avait une faute de frappe mais vous avez raison. À propos de Krening Entre Texte normal et Superscript: Dernière fois où je testais comment imprimer du texte contenant des pièces normales et superscript avec pdfcontentbyte (afin que je puisse l'imprimer dans un endroit arbitraire) J'ai suivi: imprimé Texte normal Texte normal au [30, 30] . Mesuré texte normal à l'aide de basefont.getwidthpointkerned . Disons que la valeur renvoyée était 101 . Donc, j'ai imprimé partie SuperScript Pièce Superscript Texte à [131, 30] en utilisant la même ...


... famille de polices mais plus petite taille avec un ensemble de montée de texte. Mais le résultat n'a pas été beau. En particulier, il n'était pas le même que le résultat produit lorsque je n'ai pas utilisé pdfcontentbyte mais paragraphe composé de 2 morceaux ( texte normal et < Code> Texte de Superscript Lorsque le second chunk a été défini sur Superscript - il y a un moyen de le faire, mais je ne me souviens pas de noms de méthodes ...). Le résultat produit lors de l'utilisation de paragraphe au lieu de pdfcontentbyte avait l'air bien et c'était en fait la pensée que je voulais. Il y avait un faible espace entre texte normal et texte Superscript . Je pensais que c'était parce que ...


... Paragraphe Utilisé Kingning pour calculer la distance entre ces morceaux ( texte normal et texte Superscript ). Mais paragraphe ne peut pas être utilisé avec pdfcontentbyte au moins je n'ai pas trouvé de moyen de le faire. Je ne peux donc pas imprimer paragraphe dans une position arbitraire. C'est pourquoi je voulais kerning entre le texte normal et la superscript. Si le texte laid était là depuis une autre raison, je veux juste avoir les mêmes résultats (comme avec le paragraphe ) sur l'emplacement arbitraire.


@Mark Storer: Eh bien, je veux avarder la prime et votre dernier édition pourrait très bien être la solution que je recherche. Je n'ai pas le temps de tester si cela fait vraiment ce que je veux - Bounty est terminé en 8 minutes. Je vais tester votre suggestion et suggestions des autres plus tard et éventuellement accepter de répondre ou définir une nouvelle prime si le problème n'est pas résolu. Merci et aussi merci à tous les autres qui ont posté des réponses.



1
votes

Je pense que vous pourriez être impérieux votre problème, tandis que WPF a de grandes capacités d'impression. Vous pouvez imprimer n'importe quel visuel (les visuels sont presque toutes les classes WPF) exactement comme vous les voyez à l'écran de manière très simple. Il y a un bon tutoriel ici: http://www.switchsonthecode.com/tatudials/printing- in-wpf


7 commentaires

Ça a l'air bien mais comment puis-je avoir du texte avec Superscript dans WPF? Je ne pense pas qu'il soit possible d'avoir une étiquette qui comporte certaines parties du texte dans Superscript (et Kerned). Et comment puis-je mesurer le texte alors? Juste en obtenant la valeur de accuisalwidth de l'étiquette ?


Bonjour, je ne l'ai pas essayé moi-même, mais je pense qu'ici est une solution à Superscript mêlée avec du texte normal: Stackoverflow.com/Questtions/2095583/... . Et pour la largeur, oui, c'est plus ou moins aussi facile. WPF peut mesurer la largeur de tout visuel et vous l'obtenez de ses propriétés. J'ai codé quelque chose de similaire mais je ne l'ai pas ici. Je vais vérifier plus tard à la maison. Bonne chance!


@tinchou: Bon lien! Encore une fois, j'aime plus et plus ... J'ai été presque décidé d'utiliser itextShaarp fixdocument aussi c'est bon?


Salut encore, Dasto. Je pense que vous devriez essayer cela, il ne faudra pas longtemps pour voir à quel point c'est facile. Bien que, il existe quelques limitations avec TYPO Variantes: premièrement, vous avez besoin de polices OpenType (comme Palatino). Vous pouvez lire la description ici: MSDN.MicRosoft .com / fr-nous / bibliothèque / ... et malheureusement, il y a un bug terrible: connect.microsoft.com/visualstudio/feedback/details/545057/... J'ai aussi vérifié mon code et je viens d'utiliser une propriété de largeur de formatée


Et enfin, comme vous utiliserez la fenêtre d'impression Windows commune, vous aurez le choix à «Imprimer» à un document XPS. (J'avais des problèmes de marge avec l'impression à XPS, mais je ne les ai jamais résolues parce que mon application était pour une impression réelle, et elle s'est bien déroulée). (Désolé, je me rends compte que j'écris terriblement mal et court!)


@tinchou +1 Si j'avais ce commentaire hier, il me ferait sauver 3 heures d'expérimentation, de lunettes, etc. :( cependant j'ai réussi à obtenir un effet "Superscript" en ayant span intérieur textBlock < / code> coting tout mon texte. Je définir simplement baselinealignment = "top" sur ce tann et je définit son fontsize pour être inférieur à l'entourage Texte. Cela fonctionne pour toutes les polices et même pour les nombres simples, mais cela n'a pas l'air exactement comme je le veux. Je vais poser une question distincte à ce sujet (si vous souhaitez répondre, vérifiez simplement mon profil de temps en temps et filtrerai Questions par Tag Superscript ).


@tinchou aussi je ne comprends pas ce qui est formatédtext pour et je ne sais pas comment l'utiliser. J'ai vu des exemples qui semblaient vraiment difficiles. Je n'ai pas compris. On dirait que c'est une API très faible que je lie généralement d'éviter.



1
votes

On dirait que vous devez avoir une certaine expérience dans GDI +.

J'ai travaillé pour une société de prêt hypothécaire et ils sont très particulièrement particuliers sur la manière dont ils veulent que leurs rapports soient aménagés. Jusqu'à la précision de pixels. Malheureusement, GDI + ne mesure pas très bien le texte. Par conséquent, votre meilleure alternative serait d'utiliser Windows API P>

[DllImport("gdi32.dll")]
static extern bool GetTextExtentPoint(IntPtr hdc, string lpString, 
                                      int cbString, ref Size lpSize);


2 commentaires

+1 Merci c'est beau mais comme dans le cas d'autres réponses, je ne vois pas comment faire scénario 2 de ma réponse avec GDI +. Vous avez fourni une réponse sur la façon de mesurer et d'imprimer du texte normal, comment mesurer et imprimer du texte Superscript mais aucun moyen de mesurer et d'imprimer des imprimer ensemble et Kerned ensemble (voir la note du scénario 2). S'il y a une manière que je ne vois pas, veuillez fournir un exemple de code simple / lien de méthode / description comment faire.


Je suppose que la différence de texte est que le texte (Super / Sub) Script a une taille différente puis le texte normal. GDI + vous donne les outils pour faire la peinture. Vous devrez faire l'analyse des demandes et mesurer vos chaînes, alors vous pouvez les dessiner où vous voulez. Ma recommandation est de tirer le premier texte normal, puis du texte Super ou de l'indice, et enfin le prochain ensemble de texte normal. C'est mon avis que c'est ce que toute autre application fera. Mais cela vous donnera le plus de contrôle sur votre produit.